字符集、字符序的概念與聯系
在數據的存儲上,MySQL提供了不同的字符集支持。而在數據的對比操作上,則提供了不同的字符序支持。
MySQL提供了不同級別的設置,包括server級、database級、table級、column級,可以提供非常精准的設置。
什么是字符集、字符序?簡單的來說:
- 字符集(character set):定義了字符以及字符的編碼。
- 字符序(collation):定義了字符的比較規則。
舉個例子:
有四個字符:A、B、a、b,這四個字符的編碼分別是A = 0, B = 1, a = 2, b = 3。這里的字符 + 編碼就構成了字符集(character set)。
如果我們想比較兩個字符的大小呢?比如A、B,或者a、b,最直觀的比較方式是采用它們的編碼,比如因為0 < 1,所以 A < B。
另外,對於A、a,雖然它們編碼不同,但我們覺得大小寫字符應該是相等的,也就是說 A == a。
這上面定義了兩條比較規則,這些比較規則的集合就是collation。
- 同樣是大寫字符、小寫字符,則比較他們的編碼大小;
- 如果兩個字符為大小寫關系,則它們相等。
字符集涉及數據庫配置(character_set_database)、數據表配置(默認繼承數據庫,也可以修改)、列配置(類型為CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序)、server端配置(character_set_server,所有字符最后存儲時,使用的編碼字符集)、client端配置(character_set_client)、連接端配置(character_set_connection)
- character_set_client 是指客戶端發送過來的語句的編碼;
- character_set_connection 是指mysqld收到客戶端的語句后,要轉換到的編碼;
- 而 character_set_results 是指server執行語句后,返回給客戶端的數據的編碼
使用命令查看配置:show variables like 'char%';和 show variables like 'collation_%';
我自己配置的字符集,真是亂極了,所以很容易出現亂碼問題
DBA配置的:
使用客戶端工具Navicat for MySql連接數據庫時指定下面選項后,就可以設置數據表的字符集設置
可以修改數據表的字符集
命令行連接時,設置客戶端字符集的方法(使用mysql --help查看更多可用選項):
mysql -h127.0.0.1 -uroot -proot --default-character-set=utf8mb4
連接后可以看到如下設置情況:
可以在客戶端連接里臨時修改配置,比如:set @@collation_server=utf8mb4_general_ci;但是這個配置斷開后就失效,對其他客戶端連接也沒有影響。要想全局修改,就得修改配置文件,然后重啟mysql。
感受下命令行SET NAMES UTF8;的威力,一次可以設置三個配置。
set names 設置的3個變量就是設置mysqld和客戶端通信時,mysqld應該如何解讀client發來的字符,以及返回給客戶端什么樣的編碼。
修改配置文件,以mac的xampp配置舉例,執行xamppCli進入配置目錄,然后修改配置
設置server:
查看結果,數據庫也跟着改變,因為數據庫的默認字符集繼承server:
sqlalchemy做為客戶端的字符集設置:
engine = create_engine('mysql+pymysql://user:password@ip:port/db?charset=utf8mb4', echo=False, pool_size=350,max_overflow=50,pool_recycle=300,pool_timeout=60)
show create table talbe_name;可以查看table的創建信息
collation_server服務端字符序:
utf8mb4_bin, utf8mb4_general_ci, utf8_bin, utf8_general_ci
ci 代表: casesensitive ignore 排序時不考慮大小寫;而 _bin 結尾的排序時考慮大小寫。
遺漏問題:
1、不知道navicat for mysql做為客戶端連接mysql的時候,如何設置客戶端字符集的
總結:
1、server端設置:character_set_server=utf8mb4
2、客戶端連接時帶上配置:mysql -h127.0.0.1 -uroot -proot --default-character-set=utf8mb4
參考:
1、http://mysql.taobao.org/monthly/2015/05/07/
2、https://www.cnblogs.com/chyingp/p/mysql-character-set-collation.html
3、https://www.cnblogs.com/digdeep/p/5228199.html