MySQL字符又亂碼了?快來看一下如何配置字符集吧


我們在開發過程中可能會碰到MySQL字符集的問題,有時候發現存入某個字符,數據庫存儲不對。有時候發現,存儲某個字符正確,但是獲取到的又是亂碼。這種情況下一個一個去網上搜索,實在是浪費時間。這裏總結一下MySQL中字符集的規則以及配置方法,下次遇到問題時,不妨從這裏總結的入手。
首先,先了解兩個概念。

字符集和校對規則

MySQL包含字符集(character)和校對規則(collation)兩個概念。

  • 字符集用來定義MySQL存儲字符串的方式
  • 校對規則用來定義比較字符串的方式

字符集和校對規則一般是一對多的關係

校對規則命名約定

以其相關的字符集名開始,通常包括一個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元,即比較是基於字符編碼的值而與language無關)結束。
如常見的utf8mb4字符集,它默認的校對規則utf8mb4_general_ci表示比較字符串是對大小寫不敏感。

字符集級別及設置

mysql中字符集在服務端的存儲,有4個級別的控制,分別爲:服務器級別數據庫級別表級別列級別
另外要想正確獲取,還要注意客戶端與服務器交互層次上的字符集配置。
這裏來逐一看一下如何配置以及配置如何生效的吧!

服務服務器字符集和校對規則

  • 在MySQL服務啓動的時候確定
  • 查看方法
show variables like 'character_set_server';
  • 配置方法
    配置方法有多種
  1. 在MySQL配置文件中修改,如my.cnf中:
[mysqld]
character-set-server=utf8mb4
  1. 在啓動選項中指定
mysqld --character-set-server=utf8mb4
  1. 編譯時指定
cmake . -DDEFAULT_CHARSET=utf8mb4

數據庫字符集和校對規則

  • 在創建數據庫的時候指定,也可以在創建完數據庫後通過“alter database”命令進行修改。
  • 查看方法
show variables like 'character_set_database';
show variables like 'collation_database';
  • 設置字符集的規則
  1. 如果指定了字符集和校對規則,則使用指定的字符集和校對規則
  2. 如果指定了字符集,沒有指定校對規則,則使用指定字符集的默認校對規則
  3. 如果指定了校對規則,但未指定字符集,則字符集使用與該校對規則關聯的字符集
  4. 如果沒有指定字符集和校對規則,則使用服務器字符集和校對規則作爲數據庫的字符集和校對規則

表字符集和校對規則

  • 在創建表的時候指定,可以通過"alter table"命令進行修改
  • 查看方法
show create table t1;
  • 設置字符集規則
  1. 如果指定了字符集和校對規則,使用指定的字符集和校對規則
  2. 如果指定了字符集,沒有指定校對規則,則使用指定字符集的默認校對規則
  3. 如果指定了校對規則,但未指定字符集,則字符集使用與該校對規則關聯的字符集
  4. 如果沒有指定字符集和校對規則,則使用數據庫字符集和校對規則作爲表的字符集和校對規則

列字符集和校對規則

  • 可以在創建表時指定,或者在修改表時調整
  • 如果在創建表的時候沒有特別指定字符集和校對規則,則默認使用表的字符集和校對規則

連接字符集和校對規則

上面四種,確定的是數據保存的字符集和校對規則。對於實際的應用來說,還存在客戶端和服務器之間交互的字符集和校對規則的設置。

  • 配置方法
  1. 在連接時配置,且每次連接時都需要配置
    使用
set names ***;

這條命令等價於配置了以下三個參數選項
character_set_client、character_set_connection和character_set_results,
分別代表客戶端、連接和返回結果的字符集

  1. 在MySQL配置文件中修改
[mysql]
default-character-set = utf8mb4

請注意,這裏的級別控制可能在你的業務程序代碼中被手動指定了,所以有時候服務器那邊都存儲正確了,但是拿不到正確的值,就要檢查你的代碼嘍。

MySQL字符集修改方法

不能通過直接修改數據庫或表字符集來設置,因爲舊數據不會被更新
正確的步驟應該如下:

步驟

使用mysqldump進行修正

  1. 導出表結構
  2. 手工修改表創建sql中標結構定義的字符集爲新的字符集
  3. 確保記錄不再更新後,導出所有記錄
  4. 打開數據sql,修改set names ***
  5. 使用新的字符集創建新的數據庫
  6. 創建表,執行表創建sql
  7. 導入數據,執行數據sql

以下是修改的一個例子
MySQL字符集修改流程

參考文檔:
[1]唐漢明.深入淺出MySQL數據庫開發、優化與管理維護[M].人民郵電出版社:北京,2014:156.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章