更新时间:2025-05-29 GMT+08:00

CREATE DATABASE

功能描述

创建一个新的数据库。默认情况下,创建A兼容模式数据库将通过复制标准系统数据库templatea模板进行创建,非A兼容模式数据库通过复制标准系统数据库template0进行创建。

注意事项

  • 仅拥有CREATEDB权限的用户可以进行创建新数据库操作,系统管理员默认拥有此权限。
  • 不能在事务块中执行创建数据库语句。
  • 在创建数据库过程中,出现类似“Permission denied”的错误提示,可能的原因为文件系统上数据目录的权限不足导致;出现类似“No space left on device”的错误提示,可能的原因为磁盘的存储空间已满导致。
  • 升级期间更新模板库的时候不能使用template0,templatea,templatem建库。标准系统数据库模板升级/更新期间,不能通过复制标准系统数据库template0、templatea以及templatem进行创建数据库。
  • 在创建数据库时,不允许使用templatem作为新创建的数据库名称。

语法格式

CREATE DATABASE database_name
    [ [ WITH ] { [ OWNER [=] user_name ] |
               [ TEMPLATE [=] template ] |
               [ ENCODING [=] 'encoding' ] |
               [ LC_COLLATE [=] 'lc_collate' ] |
               [ LC_CTYPE [=] 'lc_ctype' ] |
               [ DBCOMPATIBILITY [=] 'compatibility_type' ] |
               [ TABLESPACE [=] tablespace_name ] |
               [ CONNECTION LIMIT [=] connlimit ] |
               [ DBTIMEZONE [=] 'time_zone' ] }[...] ];

参数说明

  • database_name

    数据库名称。

    取值范围:字符串,要符合标识符命名规范,且最大长度不超过63个字符。

    当数据库名称超过63个字符,数据库会截断并保留前63个字符当作数据库名称。

    当数据库名称中包含大写字母时,数据库会自动转换为小写字母,如果需要创建包含大写字母的数据库名称则需要使用双引号括起来。

  • OWNER [ = ] user_name

    可选,数据库所有者。

    取值范围:已存在的用户名,未指定时,新数据库的所有者是当前用户。

  • TEMPLATE [ = ] template

    可选,创建数据库时,根据指定的标准系统数据库模板进行创建。

    GaussDB采用从模板数据库复制的方式进行创建新的数据库。初始时,GaussDB包含四个模板数据库(template0、template1、templatea和templatem)以及一个默认的用户数据库postgres。

    取值范围:template0、templatem或者templatea。

    开启templatem特性后,会新增一个模板数据库templatem。开启templatem特性,具体的数据库行为请参见《M-Compatibility开发指南》中“创建M-Compatibility数据库及用户”章节。

  • ENCODING [ = ] 'encoding'

    可选,指定数据库使用的字符编码。

    不指定时,对于M-Compatibility模式数据库,默认使用UTF8编码;其他兼容模式数据库默认使用模板数据库的编码。

    模板数据库template0、template1和templatea的编码默认与操作系统环境相关。

    template1不允许修改字符编码,若要变更编码,请使用模板数据库template0或模板数据库templatea创建数据库。

    常用取值:GBK、UTF8、Latin1或者GB18030等,具体支持的字符集如表1所示。

    表1 GaussDB字符集

    名称

    描述

    语言

    是否服务器端?

    ICU(International Components for Unicode)?

    字节/字符

    别名

    BIG5

    Big Five

    繁体中文

    1-2

    WIN950, Windows950

    EUC_CN

    扩展UNIX编码-中国

    简体中文

    1-3

    -

    EUC_JP

    扩展UNIX编码-日本

    日文

    1-3

    -

    EUC_JIS_2004

    扩展UNIX编码-日本, JIS X 0213

    日文

    1-3

    -

    EUC_KR

    扩展UNIX编码-韩国

    韩文

    1-3

    -

    EUC_TW

    扩展UNIX编码-中国台湾

    繁体中文

    1-3

    -

    GB18030

    国家标准

    中文

    1-4

    -

    GB18030_2022

    国家标准

    中文

    1-4

    -

    GBK

    扩展国家标准

    简体中文

    1-2

    WIN936, Windows936

    ISO_8859_5

    ISO 8859-5, ECMA 113

    拉丁语/西里尔语

    1

    -

    ISO_8859_6

    ISO 8859-6, ECMA 114

    拉丁语/阿拉伯语

    1

    -

    ISO_8859_7

    ISO 8859-7, ECMA 118

    拉丁语/希腊语

    1

    -

    ISO_8859_8

    ISO 8859-8, ECMA 121

    拉丁语/希伯来语

    1

    -

    JOHAB

    JOHAB

    韩语

    1-3

    -

    KOI8R

    KOI8-R

    西里尔语(俄语)

    1

    KOI8

    KOI8U

    KOI8-U

    西里尔语(乌克兰语)

    1

    -

    LATIN1

    ISO 8859-1, ECMA 94

    西欧

    1

    ISO88591

    LATIN2

    ISO 8859-2, ECMA 94

    中欧

    1

    ISO88592

    LATIN3

    ISO 8859-3, ECMA 94

    南欧

    1

    ISO88593

    LATIN4

    ISO 8859-4, ECMA 94

    北欧

    1

    ISO88594

    LATIN5

    ISO 8859-9, ECMA 128

    土耳其语

    1

    ISO88599

    LATIN6

    ISO 8859-10, ECMA 144

    日耳曼语

    1

    ISO885910

    LATIN7

    ISO 8859-13

    波罗的海

    1

    ISO885913

    LATIN8

    ISO 8859-14

    凯尔特语

    1

    ISO885914

    LATIN9

    ISO 8859-15

    带欧罗巴和口音的LATIN1

    1

    ISO885915

    LATIN10

    ISO 8859-16, ASRO SR 14111

    罗马尼亚语

    1

    ISO885916

    MULE_INTERNAL

    Mule内部编码

    多语种编辑器

    1-4

    -

    SJIS

    Shift JIS

    日语

    1-2

    Mskanji, ShiftJIS, WIN932, Windows932

    SHIFT_JIS_2004

    Shift JIS, JIS X 0213

    日语

    1-2

    -

    SQL_ASCII

    未指定(见文本)

    任意

    1

    -

    UHC

    统一韩语编码

    韩语

    1-2

    WIN949, Windows949

    UTF8

    Unicode, 8-bit

    所有

    1-4

    Unicode

    WIN866

    Windows CP866

    西里尔语

    1

    ALT

    WIN874

    Windows CP874

    泰语

    1

    -

    WIN1250

    Windows CP1250

    中欧

    1

    -

    WIN1251

    Windows CP1251

    西里尔语

    1

    WIN

    WIN1252

    Windows CP1252

    西欧

    1

    -

    WIN1253

    Windows CP1253

    希腊语

    1

    -

    WIN1254

    Windows CP1254

    土耳其语

    1

    -

    WIN1255

    Windows CP1255

    希伯来语

    1

    -

    WIN1256

    Windows CP1256

    阿拉伯语

    1

    -

    WIN1257

    Windows CP1257

    波罗的海

    1

    -

    WIN1258

    Windows CP1258

    越南语

    1

    ABC, TCVN, TCVN5712, VSCII

    ZHS16GBK

    扩展国家标准

    简体中文

    1-2

    -

    • 并非所有的客户端API都支持表1中列出的字符集。
    • SQL_ASCII设置与其他设置的行为表现存在差异。如果服务器字符集设置为SQL_ASCII,服务器会将字节值0~127根据ASCII标准进行解释,而字节值128~255则会被当作无法解析的字符。通常如果使用了任何非ASCII数据,请勿将字符集设置为SQL_ASCII,如果设置为SQL_ASCII,数据库将无法对非ASCII字符进行转换或者校验。
    • 新指定的数据库字符集编码必须与所选择的本地环境中(LC_COLLATE和LC_CTYPE)的字符集设置兼容。
    • 当指定的字符编码集为GBK或ZHS16GBK时,部分中文生僻字无法直接作为对象名。主要因为GBK第二个字节的编码范围在0x40~0x7E之间时,字节编码与ASCII字符@、A~Z、[、\、]、^、_、`、a~z、{、|以及}重叠。其中,@、[、\、]、^、_、'、{、|以及}为数据库中的操作符,直接作为对象名时,会产生语法报错。
    • 若客户端编码和服务器端编码不一致时,数据库需要支持编码格式转换,支持的所有的编码格式转换可以通过系统表PG_CONVERSION进行查看。若数据库无法进行编码格式转换,则建议客户端编码与服务器端编码保持一致,客户端编码可通过GUC参数client_encoding修改)。
    • 当指定数据库字符集编码与客户端编码同时为GB18030_2022时,须确保客户端操作系统支持的GB18030字符集为2022版本,否则由于GB18030字符集各版本间存在不完全兼容可能导致数据的不一致性。同时,当涉及到历史数据切换为GB18030_2022数据库时,应当遵循切换数据库流程进行数据迁移操作。
  • LC_COLLATE [ = ] 'lc_collate'

    可选,指定新数据库使用的字符集。

    取值范围:操作系统支持的字符集,默认使用模板数据库的字符集。

    • 该参数的使用会影响到对字符串的排序顺序,如执行ORDER BY操作的结果排序或在文本列上使用索引的排序。
    • 该参数对M-Compatibility模式数据库不生效。
    • lc_collate和lc_ctype参数的取值范围,与本地环境支持的字符集相关,如在Linux操作系统上,可通过locale -a命令获取操作系统支持的字符集列表,当使用lc_collate和lc_ctype参数时,从获取的字符集列表中选择用户需要的字符集和字符分类。
    • 如果需要设置字符编码集为GB18030_2022时,lc_collate参数和lc_ctype参数的取值范围与GB18030保持一致。
    • 如果需要设置字符编码集为ZHS16GBK时,lc_collate参数和lc_ctype参数的取值范围需与GBK字符集保持一致。
  • LC_CTYPE [ = ] 'lc_ctype'

    可选,指定新数据库使用的字符分类。

    取值范围:操作系统支持的字符分类,默认是使用模板数据库的字符分类。

    • 该参数的使用会影响到字符的分类,如大写、小写和数字。
    • 该参数对M-Compatibility模式数据库不生效。
    • lc_collate和lc_ctype参数的取值范围,与本地环境支持的字符集相关,如在Linux操作系统上,可通过locale -a命令获取操作系统支持的字符集列表,当使用lc_collate和lc_ctype参数时,从获取的字符集列表中选择用户需要的字符集和字符分类。
    • 如果需要设置字符编码集为GB18030_2022时,lc_collate参数和lc_ctype参数的取值范围与GB18030保持一致。
    • 如果需要设置字符编码集为ZHS16GBK时,lc_collate参数和lc_ctype参数的取值范围需与GBK字符集保持一致。
  • DBCOMPATIBILITY [ = ] 'compatibility_type'

    可选,指定兼容的数据库的类型,默认兼容O。

    取值范围:A、B、C、PG以及M。分别表示兼容O、MY、TD、POSTGRES和M-Compatibility。

    • A兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。
    • 将字符串转换成整数类型时,如果输入不合法,B兼容性会将输入转换为0,而其他兼容模式数据库下则会报错。
    • PG兼容模式数据库下,CHAR和VARCHAR以字符为计数单位,其他兼容模式数据库以字节为计数单位。例如,对于UTF-8字符集,CHAR(3)在PG兼容性下能存放3个中文字符,而在其他兼容模式数据库下只能存放1个中文字符。
    • M-Compatibility模式数据库下,数据库特性请参见《M-Compatibility开发指南》。在需要使用MY兼容模式(MY兼容B模式和MY兼容M-Compatibility模式)时,推荐使用M-Compatibility模式数据库,其在语法、数据类型、元数据、协议等功能上与MY数据库有更好的兼容度;B模式由于架构限制,无法很好地与MY兼容,后续不再演进,不推荐使用。
  • TABLESPACE [ = ] tablespace_name

    可选,指定数据库对应的表空间。

    取值范围:已存在表空间名。

  • CONNECTION LIMIT [ = ] connlimit

    可选,数据库可以接受的并发连接数。

    取值范围:[-1, 2^31-1]的整数。默认值为-1,表示没有限制。

    • 系统管理员不受此参数的限制。
    • connlimit数据库主节点单独统计,数据库整体的连接数 = connlimit * 当前正常数据库主节点个数。
  • DBTIMEZONE [ = ] time_zone

    指定新数据库的时区。

    该参数会影响新数据库的时区。默认设置为PRC时区。

    取值范围:

    • 操作系统支持的时区名称和缩写。
    • -15:59~+15:00时间戳范围。

    前提条件:当前连接数据库是A兼容模式数据库且已设置a_format_version='10c'以及a_format_dev_version='s2'。

有关字符编码的一些限制:

  • 若区域设置为C(或POSIX),则允许所有的编码类型,但是对于其他的区域设置,字符编码必须和区域设置相同。
  • 若字符编码方式是SQL_ASCII,并且修改者为管理员用户时,则字符编码可以和区域设置不相同。
  • 编码和区域设置必须匹配模板数据库,除了将template0或templatea当作模板。 因为其他数据库可能会包含不匹配指定编码的数据,或者可能包含排序顺序受LC_COLLATE和LC_CTYPE影响的索引。复制这些数据会导致在新数据库中的索引失效。template0/templatea是不包含任何会受到影响的数据或者索引。

示例

--创建jim用户。
gaussdb=# CREATE USER jim PASSWORD '********';

--创建一个GBK编码的数据库testdb1。
gaussdb=# CREATE DATABASE testdb1 ENCODING 'GBK' template = template0;
--查看数据库testdb1信息。
gaussdb=#SELECT datname,pg_encoding_to_char(encoding) FROM pg_database WHERE datname = 'testdb1';
 datname | pg_encoding_to_char 
---------+---------------------
 testdb1 | GBK
(1 row)
--创建可以接受1000并发连接数的数据库。
gaussdb=# CREATE DATABASE testdb4 CONNECTION LIMIT=1000;
--查看testdb4信息。
gaussdb=# SELECT datname,datconnlimit  FROM pg_database where datname = 'testdb4';
 datname | datconnlimit 
---------+--------------
 testdb4 |         1000
(1 row)
--创建表空间。
gaussdb=# CREATE TABLESPACE tbs_test RELATIVE LOCATION 'test_tablespace/tbs_test';
--创建数据库指定默认表空间为tbs_test。
gaussdb=# CREATE DATABASE testdb5 TABLESPACE = tbs_test ;
--查看testdb5信息。
gaussdb=# SELECT db.datname,ts.spcname FROM pg_database db JOIN pg_tablespace ts ON db.dattablespace = ts.oid WHERE db.datname = 'testdb5';
 datname | spcname  
---------+----------
 testdb5 | tbs_test
(1 row)
--创建兼容A格式的数据库testdb2,并指定所有者为jim。
gaussdb=# CREATE DATABASE testdb2 OWNER jim DBCOMPATIBILITY = 'A';
--查看testdb2信息。
gaussdb=# SELECT t1.datname,t2.usename,t1.datcompatibility 
                   FROM pg_database t1,gs_user t2 
                   WHERE t1.datname = 'testdb2' AND t1.datdba=t2.usesysid;
 datname | usename | datcompatibility 
---------+---------+------------------
 testdb2 | jim     | A
(1 row)
gaussdb=# CREATE DATABASE testdb_tmp OWNER jim template=templatea;
--查看testdb2信息。
gaussdb=# SELECT t1.datname,t2.usename,t1.datcompatibility 
                   FROM pg_database t1,gs_user t2 
                   WHERE t1.datname = 'testdb_tmp' AND t1.datdba=t2.usesysid;
  datname   | usename | datcompatibility 
------------+---------+------------------
 testdb_tmp | jim     | A
(1 row)
--切换至A兼容性数据库testdb2,并设置会话参数。
gaussdb=# \c testdb2
testdb2=# SET a_format_version='10c';
testdb2=# SET a_format_dev_version='s2';
--创建兼容A格式的数据库并指定时区。
testdb2=# CREATE DATABASE testdb3 DBCOMPATIBILITY 'A' DBTIMEZONE='+08:00';
--查看testdb3信息。
testdb2=# SELECT datname,datcompatibility,dattimezone FROM pg_database WHERE datname = 'testdb3';
 datname | datcompatibility | dattimezone 
---------+------------------+-------------
 testdb3 | A                | +08:00
(1 row)
--切换至初始数据库,请根据实际情况修改数据库名。
testdb2=# \c postgres
--删除数据库。
gaussdb=# DROP DATABASE testdb1;
gaussdb=# DROP DATABASE testdb2;
gaussdb=# DROP DATABASE testdb3;
gaussdb=# DROP DATABASE testdb4;
gaussdb=# DROP DATABASE testdb5;
gaussdb=# DROP DATABASE testdb_tmp;
--删除用户。
gaussdb=# DROP USER jim;
--删除表空间。
gaussdb=# DROP TABLESPACE tbs_test;

相关链接

ALTER DATABASEDROP DATABASE