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;
 
  