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

CREATE DATABASE

功能描述

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

注意事项

  • 仅拥有CREATEDB权限的用户可以创建新数据库,系统管理员默认拥有此权限。
  • 不能在事务块中执行创建数据库语句操作。
  • 在创建数据库过程中,若出现类似“could not initialize database directory”的错误提示,可能是原因为文件系统上数据目录的权限不足或磁盘的存储空间已满等原因导致。
  • 在创建数据库时,不允许使用templatem作为新创建的数据库名称。
  • 创建数据库的顺序是依次下发给各节点进行执行的,如果远端节点执行失败则会提示“CONTEXT: Error message received from nodes: 节点名称”的报错信息。

语法格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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。

  • ENCODING [ = ] 'encoding'

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

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

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

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

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

    表1 支持的字符集

    名称

    描述

    语言

    是否服务器端

    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'

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

    取值范围:MYSQL、TD、ORA、PG、M。分别表示兼容MySQL、TD(Teradata)、Oracle、PostgreSQL和M-Compatibility。

    • ORA兼容性下,数据库将空字符串作为NULL处理,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。
    • 将字符串转换成整数类型时,如果输入不合法,MYSQL兼容模式数据库会将输入转换为0,而其他兼容模式数据库则会报错。
    • PG兼容模式数据库下,CHAR和VARCHAR以字符为计数单位,其他兼容模式数据库以字节为计数单位。例如,对于UTF-8字符集,CHAR(3)在PG兼容性下能存放3个中文字符,而在其他兼容模式数据库下只能存放1个中文字符。
    • 执行语句报错时,部分报错信息中显示“A-format”或“B-format”,表示“ORA-format”或“MYSQL-format”。
    • M-Compatibility模式数据库下,数据库特性请参见《M-Compatibility开发指南》。
  • TABLESPACE [ = ] tablespace_name

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

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

  • CONNECTION LIMIT [ = ] connlimit

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

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

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

    指定新数据库的时区。

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

    取值范围:

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

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

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

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

示例

--创建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)
--创建兼容ORA格式的数据库testdb2,并指定所有者为jim。
gaussdb=# CREATE DATABASE testdb2 OWNER jim DBCOMPATIBILITY = 'ORA';
--查看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     | ORA
(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     | ORA
(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)
--切换至ORA兼容性数据库testdb2,并设置会话参数。
gaussdb=# \c testdb2
testdb2=# SET a_format_version='10c';
testdb2=# SET a_format_dev_version='s2';
--创建兼容ORA格式的数据库并指定时区。
testdb2=# CREATE DATABASE testdb3 DBCOMPATIBILITY 'ORA' DBTIMEZONE='+08:00';
--查看testdb3信息。
testdb2=# SELECT datname,datcompatibility,dattimezone FROM pg_database WHERE datname = 'testdb3';
 datname | datcompatibility | dattimezone 
---------+------------------+-------------
 testdb3 | ORA              | +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

优化建议

  • create database

    事务中不支持创建database。

  • ENCODING

    当新建数据库Encoding与模板数据库(SQL_ASCII)不匹配(为'GBK' /'UTF8'/'LATIN1'/'GB18030'/'GB18030_2022'/'ZHS16GBK')时,必须指定template [=] template0/templatea。