最近一个干了几年的PostgreSQL同学问我一个问题,说他被嘲笑了,他们公司的老DBA说他连个数据库都不会建,我就问他,PostgreSQL也不是分布式,有新概念,他怎么说的你,怎么就连个数据库都不会建了,不过最后我看他是不大会建数据库。
我将整体的事情还原一下,我觉得还挺有意思的。
DBA: 老师我想问一句,PostgreSQL建立数据库,不就是create database + 数据库名就行了吗? 我这有一个迁移的工作,从ORACLE 那边迁移一一些表过来,然后我这数据库都建上了,我们公司那个老家伙,看完说我根本不会建数据库,气的我要死。但我也不敢问他,每次问完都是我的问题,我想我别挨骂了,我先问问我这样做对不对。
我:命令没有错误,但你做迁移,你几个问题都明白吗?
DBA: 明白什么?
我:字符排序? 这个你没有对照原库来参照一下吗?
DBA:为什么建一个库,要考虑这些,PG这方面有什么要求吗?
我: 你建立数据库的时候,或者说你初始化数据库的时候,你怎么弄的?
DBA: 挺简单的,就编译,然后初始化一下,网上都是这些命令,没有什么难的、
我: 给你三个PG 数据库初始化时使用的命令,你当时安装的时候用的哪个
A initdb --encoding=UTF8 --locale=C -D /pdata/data
--wal-segsize=64
B initdb --encoding=UTF8 --locale=zh_CN.UTF-8 --lc-collate=zh_CN.utf8 --lc-ctype=zh_CN.utf8 -D /pdata/data
C initdb --encoding=UTF8 --locale=en_US.UTF-8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8 -D /pdata/data
DBA: 我哪个都没用呀,我就初始化一下而已 initdb -D /var/lib/postgresql/data 这不就和Oracle 安装完,初始化一下一个意思吗?
我:那你没有问一下迁移过来的数据库查询中有没有对一些特殊文字的排序的要求?
DBA:没有,不就是把数据倒过来就行了吗? 我就一个DBA,我管那么多? 还有那个64是什么呀?
我: 你先别问64是什么了? 我觉得你们家老DBA,说你说的有道理
DBA: 哪里有道理,不就是充大辈,没好事,欺负我年轻 !有啥了不起
我: 呵呵,好吧,那就到此为止哈!
DBA: 唉那你还没说,他说的对不对呀,我那错了
我: 你没错,他错了,他应该眼见你掉沟里,然后送上祝福的眼神,他太多嘴了。
DBA: 不是你们这些岁数大的都这么吊,那你说说,我到底哪里错了。
我: 好,咱们说说
1 你迁移数据库,你问过迁移时那个数据库的查询中排序按照什么规则了吗?
2 你字符集呢,你字符集怎么设置的,你问过原来的数据库上有没有一些特殊的字符
3 如果你问了,你数据库就这么安装 ,这么建立??
DBA:我就一个DBA 我问那么多干嘛? 和我有什么关系
我:来你看看,下面一样的数据,为什么排序完毕后,顺序不一样
CREATE TABLE test_table (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO test_table (name) VALUES
('张三'),
('LiLei'),
('Alice'),
('王五'),
('李四'),
('alice'),
('Aarav'),
('123abc');
SELECT name FROM test_table ORDER BY name;
name
------
123abc
Aarav
Alice
LiLei
alice
张三
李四
王五
SELECT name FROM test_table ORDER BY name;
name
------
123abc
Aarav
Alice
LiLei
alice
李四
张三
王五
DBA: 这,我哪里知道,和数据有关吧,不就是排序吗?
我: 就排序,原来人家在ORACLE 时候程序输出来的结果,假设是上面的,到你PG库然后输出是下面这样的,人家不找你,啊
DBA : 那我怎么办,看来这还和我有关系了。我是记得是一个人口普查类的,好像是有一些中文的字段排序?
我: 上面第一个是C 排序的,下面的是 zh_CN.UTF-8排序的,这就是区别。
DBA: 那这样,老师,我假设我要中文的我怎么办?你给指个道
我: 1 你初始化数据库的时候,可以考虑locale , --lc-collate 进行特殊的指定 initdb --encoding=UTF8 --locale=zh_CN.UTF-8 --lc-collate=zh_CN.utf8 --lc-ctype=zh_CN.utf8 -D /var/lib/postgresql/data
2 如果你没有,你需要创建数据库的时候,特殊指定 CREATE DATABASE test1 TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE='zh_CN.utf8' LC_CTYPE='zh_CN.utf8';
这样来设定你的数据库默认支持的排序和字符集,当然我这是猜测,还有其他的中文排序的方法,你的和你的ORACLE 上的设置一致。
--lc-collate=zh_CN.utf8: 设置排序规则,适用于中文排序。
--lc-ctype=zh_CN.utf8: 设置字符分类,支持中文字符集。
这只是PG上设置中文的一种而已,其他的你自己去查。
DBA : 哦我明白了,那个还有为什么你创建数据要带上 template0 呀,还有那个你初始化的时候为什么带上 64呀?
是呀为什么呢?
总结: “天下聪明俊秀不少,所以德不加修,业不加广者,只为因循二字,耽阁一生。”
-----------------------------------------------
参考:
CREATE DATABASE testdb
WITH
OWNER = postgres
ENCODING = 'UTF8'
LC_COLLATE = 'zh_CN.utf8'
LC_CTYPE = 'zh_CN.utf8'
TEMPLATE = template0
CONNECTION LIMIT = -1;
···
OWNER = postgres
数据库的所有者,默认为当前执行命令的用户,通常是postgres
。可以指定其他用户。ENCODING = 'UTF8'
数据库的字符编码,这里选择UTF8
,兼容多语言字符集。LC_COLLATE = 'zh_CN.utf8'
排序规则,指定为中文环境的拼音排序。LC_CTYPE = 'zh_CN.utf8'
字符分类规则,适用于中文字符。TEMPLATE = template0
强制使用template0
创建数据库,以避免继承默认模板中的区域设置。CONNECTION LIMIT = -1
允许的最大连接数,-1
表示不限制。本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!