开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2590人左右 1 + 2 + 3 + 4 +5 + 6 + 7)(1 2 3 4 5 6群均已爆满,新人进7群,开8群)
最近一个干了几年的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: 设置字符分类,支持中文字符集。
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
表示不限制。我们最后整理一下建立一个数据库(逻辑)表到底需要考虑什么
PostgreSQL 相关文章
PostgreSQL 事务读取行 不使用行锁 真的? 利弊双刃剑
PostgreSQL 稳定性平台 PG中文社区大会--杭州来去匆匆
PostgreSQL 分组查询可以不进行全表扫描吗?速度提高上千倍?
POSTGRESQL --Austindatabaes 历年文章整理
PostgreSQL 查询语句开发写不好是必然,不是PG的锅
OceanBase 相关文章
PolarDB 相关文章
PolarDB 并行黑科技--从百套MySQL撤下说起 (感谢8018个粉丝的支持)
PolarDB 杀疯了,Everywhere Everytime Everydatabase on Serverless
POLARDB 从一个使用者的角度来说说,POALRDB 怎么打败 MYSQL RDS
PolarDB 最近遇到加字段加不上的问题 与 使用PolarDB 三年感受与恳谈
PolarDB 从节点Down机后,引起的主从节点强一致的争论
PolarDB serverless 真敢搞,你出圈了你知道吗!!!!
PolarDB VS PostgreSQL "云上"性能与成本评测 -- PolarDB 比PostgreSQL 好?
临时工访谈:PolarDB Serverless 发现“大”问题了 之 灭妖记 续集
临时工访谈:庙小妖风大-PolarDB 组团镇妖 之 他们是第一
POLARDB -- Ausitndatabases 历年的文章集合
PolarDB for PostgreSQL 有意思吗?有意思呀
MongoDB 相关文章
数据库 《三体》“二向箔” 思维限制 !8个公众号联合抽奖送书 建立数据库设计新思维
MongoDB 是外星人,水瓶座,怎么和不按套路出牌的他沟通?
MySQL相关文章
阿里云系列
阿里云数据库产品权限设计缺陷 ,六个场景诠释问题,你可以做的更好?
阿里云数据库--市场营销聊胜于无--3年的使用感受与反馈系列
阿里云数据库产品 对内对外一样的卷 --3年阿里云数据库的使用感受与反馈系列
阿里云数据库使用感受--客户服务问题深入剖析与什么是廉价客户 --3年的使用感受与反馈系列
阿里云数据库使用感受--操作界面有点眼花缭乱 --3年的使用感受与反馈系列