前言:PG初始化之后自带模板库template0和template1,那我们在平时使用过程中有什么区别呢。
1. template0与template1是否都可以连接
postgres=# \connect template0
致命错误: 数据库 "template0" 当前不接受联接
保留上一次连接
postgres=# \connect template1
您现在已经连接到数据库 "template1",用户 "postgres".
template0是不能直接连接使用的;
template1则可以,出于安全考虑,一般会删除默认的postgres数据库,但我们想连到一个库,却不知道或不记得数据库名称了,这时可以连接template1,进去后在使用\l查看数据库列表。
2. template0与template1是否可以修改
template0是一个干净的模板库,不能修改;
template1可以定制修改,比如创建extension或者oracle相关的兼容视图及函数等,后续再创建database时,默认以template1为模板将继承过来。
3. template0与template1是否可以删除
postgres=# drop database template1;
错误: 无法删除模板数据库
postgres=# alter database template1 is_template false;
ALTER DATABASE
postgres=# drop database template1;
DROP DATABASE
都可以删除,只要把is_template属性设置为false,即可删除。
关于is_template属性:如果设置了这个标志,那么该数据库可以被任何有 CREATEDB权限的用户作为模板库使用(克隆复制);如果没有被设置,那么只有超级用户和该数据库的拥有者可以克隆复制。
4. template0与template1是否可以指定新的编码
postgres=# CREATE DATABASE clocaledb
WITH ENCODING 'SQL_ASCII'
LC_COLLATE='C'
LC_CTYPE='C'
TEMPLATE=template1;
错误: 新的编码(SQL_ASCII)与模板数据库(UTF8)的编码不兼容
提示: 在模版数据库中使用同一编码,或者使用template0作为模版.
postgres=# CREATE DATABASE clocaledb
WITH ENCODING 'SQL_ASCII'
LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0;
CREATE DATABASE
--其他例子
CREATE DATABASE englishdb
WITH ENCODING 'UTF8'
LC_COLLATE='en_GB.UTF8'
LC_CTYPE='en_GB.UTF8'
TEMPLATE=template0;
--简体中文字符集
CREATE DATABASE chinadb
WITH ENCODING 'EUC_CN'
LC_COLLATE='C'
LC_CTYPE='C'
TEMPLATE=template0;
--简体中文字符集
CREATE DATABASE chinadb2
WITH ENCODING 'EUC_CN'
LC_COLLATE='zh_CN'
LC_CTYPE='zh_CN'
TEMPLATE=template0;
当且仅当用template0作为模板数据库时可指定新的编码(这里指server_endoding)
PG被支持的字符集参考http://www.postgres.cn/docs/10/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED
ERROR: encoding “XXX” does not match locale “XXX”
———— / END / ————

点击下方“阅读原文”查看更多精彩内容☺
本文分享自微信公众号 - 墨天轮(enmocs)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。