特殊漢字“𣸭”引發的對於字符集的思考;mysql字符集;sqlalchemy字符集設置;客戶端字符集設置;


字符集、字符序的概念與聯系

在數據的存儲上,MySQL提供了不同的字符集支持。而在數據的對比操作上,則提供了不同的字符序支持。

MySQL提供了不同級別的設置,包括server級、database級、table級、column級,可以提供非常精准的設置。

什么是字符集、字符序?簡單的來說:

  1. 字符集(character set):定義了字符以及字符的編碼。
  2. 字符序(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。

  1. 同樣是大寫字符、小寫字符,則比較他們的編碼大小;
  2. 如果兩個字符為大小寫關系,則它們相等。

 

字符集涉及數據庫配置(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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM