PostgreSQL Collation 怎麼調整,為什麼很多專案都選擇 Ctype
按照我們的理解,Encoding 是編碼規則,collate是基於這個編碼規則中對於字元的排序,而 CTYPE 是什麼,Ctype是針對字元的大小寫比對起作用的配置。
所以在MYSQL 中一個位置的配置,在PG 中是透過 collate 和 ctype 聯合設定的,這相對可能給POSTGRESQL 更多的額靈活性。
select collname,collencoding,collcollate,collctype from pg_collation where collname like 'C%';
下面我們提出一些關於collate 和 ctype的問題,繼續深入這個問題
1 C collcollate collctype 是 C 是一個針對POSTGRESQL 在字元進行排序和大小寫中值得推薦的選項嗎?
基於POSTGRESQL 中的編碼和作業系統之間的關係,在部分情形下編碼與相關的排序和大小寫比對的規則是不相容的,因為不同的編碼下的比對的規則與各個字符集之間包含的字元是有關的。
而C 這個排序的規則,則是通用的一種方式,他非常的簡單,使用最簡單的規則,僅僅針對 a-z A-Z 字母進行值的排序,所以在擔心由於作業系統或者一些不認知的字符集在排序規則或比較大小寫方面的不同(實際上是使用者對於選擇的collate,ctype的不認知),使用C collate ,C Ctype 是一個好的選擇,因為足夠的簡單,不容易產生另使用者疑惑的一些結果。
所以很多專案中尤其是外包專案中,可以發現很多的collate 和 ctype 是 C,而不是中文字符集也不是英文字符集,最簡單的未必是最好的,但最簡單的出現的問題也可能是最少的。同時選擇C 也是去除本地化作業系統的設定給POSTGRESQL 帶來影響的一個選擇。
2 不同的collate 是否可以比較大小 ?
select *,name1 COLLATE "C" < name2 COLLATE "C" as compare from collates;
可以看到如果是使用同樣的collate 是可以比較大大小的,上圖大寫的字母小於小寫的字母。
那麼我們兩個不同的COLLATE來進行比較會怎麼樣,看下圖也很清楚,兩個不同的 collate 是無法比較的。
3 建立資料庫的時候,選擇的collate 和 ctypte 是否可以改變 ?與初始化資料庫中的字符集
CREATE DATABASE database_c WITH ENCODING 'UTF8' LC_COLLATE='C' LC_CTYPE='C' TEMPLATE=template0;
以上我們建立的資料庫database_c 使用的字符集是 UTF8 ,同時使用的 COLLATE 和 CTYPE 為 C ,而如果你在建立資料庫時不指定collate, ctype則你的資料庫預設的collate, ctype 就為你初始化資料庫時給出的引數。
所以說到這裡我們還的說一下我們初始化資料庫中關於字符集的問題
這裡的說道初始化POSTGRESQL 資料庫的問題
initdb -D /pgdata/data --wal-segsize=64 -E UTF8 --locale=C --lc-collate=C --lc-ctype=C
我們可以看到,在初始化的資料庫裡面的 locale, lc-collate , lc-ctype 等引數都選擇了C 後,在不給任何引數建立資料庫時,資料庫的引數就會和你初始化資料庫中的選擇是一致的。
下面的截圖,在建立資料庫的時候,不給任何引數的情況下,建立的資料庫的預設 encoding, collate,ctype 等均與初始化資料庫中給定的引數一致。
那麼這些有預設的資料庫,是否可以在執行後,修改encoding, collate ,ctype.
update pg_database set datcollate='en_US.utf8',datctype='en_US.utf8' where datname='database_c';
這裡我們可以看到原來的C 已經被修改成 en_us.utf8 等
update pg_database set datcollate='C',datctype='C' where datname='database_c';
那麼如果我們在資料庫初始化時選錯了collate,ctype 還有其他的方案嗎?有,我們可以在模板資料庫中做一個工作,將模板資料庫修改為你要的collate, ctype .
4 資料庫和表之間的collate, ctype 可以不同嗎 ?表的列可以有自己的collate,ctype 嗎?
create table collates (id serial primary key, name1 varchar(20) collate "en_US.utf8",name2 varchar(20));
insert into collates (name1,name2) values ('C','c');
insert into collates (name1,name2) values ('c','C');
insert into collates (name1,name2) values ('CC','cc');
insert into collates (name1,name2) values ('cc','CC');
insert into collates (name1,name2) values ('Cc','cC');
這裡我們的欄位中有獨立的一個欄位的collate 是 en_US.utf8 其他的字元欄位是C
在POSTGRESQL 中表是不能自己設定自己的collate,但是針對與表中的列是可以設定collate的。
5 Postgresql 的索引是否可以個性化建立,這對collate
POSTGRESQL 是可以針對列進行不同的collate 的索引的建立
create index idx_name1_c on collates (name1 collate "C");
create index idx_name1_zh on collates (name1 collate "zh_CN");
這裡針對一個欄位可以建立多個使用不同collate的索引方式,這也是眾多資料庫中獨有的一種方式。案例參見上圖和下面的步驟。
QUERY PLAN
----------------------------------------------------------------
Sort (cost=1.11..1.12 rows=5 width=178)
Sort Key: name1 COLLATE "zh_CN"
-> Seq Scan on collates (cost=0.00..1.05 rows=5 width=178)
(3 rows)
database_c=# explain select * from collates order by name1 collate "C";
QUERY PLAN
----------------------------------------------------------------
Sort (cost=1.11..1.12 rows=5 width=178)
Sort Key: name1 COLLATE "C"
-> Seq Scan on collates (cost=0.00..1.05 rows=5 width=178)
(3 rows)
總結,在POSTGRESQL 中的collate ,ctype 大多依賴與系統,在最上面已經說明如果想簡單並且和系統無關,可以選擇C 作為collate, ctype 作為選擇,而如果是中文的環境,需要了解是否有中文比對的情況,如果有則需要使用對應的中文的collate, ctype 等。
所以此時你還認為collate, ctype 還是和DBA 無關的部分嗎?
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024924/viewspace-2934971/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼很多程式設計師都選擇跳槽?程式設計師
- 為什麼選擇PostgreSQL而不是MySQLMySql
- 聚合支付代理商加盟,為什麼很多人都選擇網付
- 為什麼你應當選擇 PostgreSQL 而不是 Oracle?SQLOracle
- 為什麼很多人入門選擇Python爬蟲?Python爬蟲
- 專案經理怎麼選擇?(轉)
- 從模型選擇到超參調整:如何為機器學習專案選擇演算法模型機器學習演算法
- 為什麼很多人會選擇學網路安全?前景如何?
- 為什麼選擇使用 OKR 進行專案過程管理OKR
- J2EE專案中為什麼選擇SSH框架框架
- mysql 為什麼很多網際網路公司選擇了讀可提交MySql
- 為什麼選擇Guice框架GUI框架
- Aembit為什麼選擇 Rust?Rust
- 為什麼選擇使用Rust?Rust
- 為什麼要選擇SQL?SQL
- 為什麼很多SpringBoot開發者放棄了Tomcat,選擇了UndertowSpring BootTomcat
- 為什麼很多程式設計師工作時都戴耳機?程式設計師
- 在公鏈專案早期,為什麼PoW是一個更好選擇?
- 為什麼選擇.NETCore?NetCore
- 為什麼選擇centos系統CentOS
- 為什麼選擇高防DNS?DNS
- 為什麼選擇Cynefin框架? – zwischenzugs框架
- (轉)為什麼選擇機器學習策略機器學習
- 我為什麼選擇 Angular 2?Angular
- Android為什麼選擇binderAndroid
- 為什麼選擇Twitter Storm?薦ORM
- 為什麼很多公司都轉型go語言開發?Go語言能做什麼Go
- 為什麼選擇ASP.NET CoreASP.NET
- 老闆:你為什麼要選擇 Vue?Vue
- 為什麼做AI的都選Python?AIPython
- 共享wifi專案哪個公司好,要怎麼選擇?WiFi
- 為什麼爬蟲語言大多都會選擇Python而不是Java?爬蟲PythonJava
- 我為什麼選擇成為獨立開發者
- 為什麼很多大資料專案搞著搞著就黃了?大資料
- 為什麼很多企業的神祕顧客專案收效甚微
- 為什麼選擇獨立伺服器伺服器
- 為什麼選擇學習六西格瑪?
- 為什麼爬蟲要選擇住宅代理?爬蟲