
# CREATE DATABASE
#### 功能描述
创建一个新的数据库。默认情况下，新数据库将通过复制标准系统数据库templatea模板进行创建。
#### 注意事项
- 仅拥有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**
  数据库名称。
  取值范围：字符串，要符合[标识符命名规范](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0330.html#ZH-CN_TOPIC_0000002558947985__zh-cn_topic_0000002527058134_section1257443811315)，且最大长度不超过63个字符。
  当数据库名称超过63个字符，数据库会截断并保留前63个字符当作数据库名称。
  当数据库名称中包含大写字母时，数据库会自动转换为小写字母，如果需要创建包含大写字母的数据库名称则需要使用双引号括起来。
  
- **OWNER \[ = \] user_name**
  可选，数据库所有者。
  取值范围：已存在的用户名，未指定时，新数据库的所有者是当前用户。
  
- **TEMPLATE \[ = \] template**
  可选，创建数据库时，根据指定的标准系统数据库模板进行创建。
  GaussDB采用从模板数据库复制的方式进行创建新的数据库。初始时，GaussDB包含四个模板数据库（template0、template1、templatea和templatem）以及一个默认的用户数据库postgres。
  取值范围：template0、templatem或者templatea。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  开启templatem特性后，会新增一个模板数据库templatem。开启templatem特性，具体的数据库行为请参见《M-Compatibility开发指南》中"创建M-Compatibility数据库及用户"章节。
  
- **ENCODING \[ = \] 'encoding** '
  可选，指定数据库使用的字符编码。
  不指定时，对于M-Compatibility模式数据库，默认使用UTF8编码；其他兼容模式数据库默认使用模板数据库的编码。
  模板数据库template0、template1和templatea的编码默认与操作系统环境相关。
  template1不允许修改字符编码，若要变更编码，请使用模板数据库template0或模板数据库templatea创建数据库。
  常用取值：GBK、UTF8、Latin1或者GB18030等，具体支持的字符集如[表1]所示。
   表1GaussDB字符集 
  | **名称**         | **描述**                     | **语言**         | **是否服务器端？** | **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       | -                                     |
     
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  - 并非所有的客户端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](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0910.html#ZH-CN_TOPIC_0000002559108255)进行查看。若数据库无法进行编码格式转换，则建议客户端编码与服务器端编码保持一致，客户端编码可通过GUC参数client_encoding修改）。
  
  - 当指定数据库字符集编码与客户端编码同时为GB18030_2022时，须确保客户端操作系统支持的GB18030字符集为2022版本，否则由于GB18030字符集各版本间存在不完全兼容可能导致数据的不一致性。同时，当涉及到历史数据切换为GB18030_2022数据库时，应当遵循切换数据库流程进行数据迁移操作。
    
- **LC_COLLATE \[ = \] 'lc_collate** '
  可选,指定新数据库使用的字符集。
  取值范围：操作系统支持的字符集，默认使用模板数据库的字符集。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  - 该参数的使用会影响到对字符串的排序顺序，如执行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** '
  可选，指定新数据库使用的字符分类。
  取值范围：操作系统支持的字符分类，默认是使用模板数据库的字符分类。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 该参数的使用会影响到字符的分类，如大写、小写和数字。
  
  - 该参数对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。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 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，表示没有限制。
  ![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
  - 系统管理员不受此参数的限制。
  
  - 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 DATABASE](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0480.html#ZH-CN_TOPIC_0000002527828268)，[DROP DATABASE](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/gaussdb-42-0597.html#ZH-CN_TOPIC_0000002559108043)
