1、 Mysql支持的字符集
MySQL服務器可以支持多種字符集,不同的字段都可以使用不同的字符集。
查看所有可用字符集:
show character set;
select * from information_schema.character_sets;
MySQL的字符集包括字符集(CHARACTER)和校對規則(COLLATION)兩個概念。其中字符集定義MySQL存儲字符串的方式,校對規則用來定義比較字符串的方式。字符集和校對規則是一對多的關系。
注:目前線上服務器上用utf8mb4 和utf8mb4_bin。
校對規則可用 show collation like ‘xxx’ 查看。
校對規則命名約定:已其相關的字符集名開始,通常包括一個語言名,並且以_ci(大小寫敏感)、_cs(大小寫不敏感)或者_bin(二院,即比較是基於字符編碼的值而與language無關,區分大小寫)結束。
2、 MySQL字符集的設置
MySQL的字符集和校對規則有4個級別的默認設置:服務器級、數據庫級、表級和字段級。
1)服務器字符集和校對規則
- 在my.cnf中設置
[mysqld]
character-set-server=utf8mb4
- 在啟動選項中指定:
mysqld --character-set-server=utf8mb4
- 或者在編譯時指定:
shell> cmake . –DDEFAULT_CHARSET=utf8mb4
查看當前服務器的字符集和校對規則:
show variables like ‘character_set_server’;
show variables like ‘collation_server’;
如果沒有設置則默認是latin 1字符集。(MySQl5.6版本)
2)數據庫字符集和校對規則
在數據庫創建的時候指定,也可以在創建完數據庫后通過alter database 命令進行修改。
查看當前數據庫字符集和校對規則:
show variables like ‘character_set_database’;
show variable like ‘collation_database’;
3)表字符集和校對規則
在建表的時候可以指定字符集和校對規則,也可以通過alter table 命令進行修改(一般不用)。如果沒有指定,則使用數據庫的規則。
查看表的字符集和校對規則:show create table table_name;
4)列字符集和校對規則
同上
5)連接字符集和校對規則
以上4中設置方式,確定的事數據保存字符集和校對規則,對於實際應用訪問來說,還存在客戶端和服務器之間交互的字符集和校對規則的設置。
客戶端和服務器的交互操作,MySQL提供了三個不同的character_set_client、character_set_connection和character_set_result,分別表客戶端、連接和返回結果的字符集。通常情況下需要確保三者一樣。可以用set names utf8mb4;命令來同時設置三個參數。
另一個簡便方法:在my.cnf里設置客戶端
[mysql]
default-character-set=utf8mb4
3、 字符集修改
如果在應用開始階段沒有正確的選擇字符集,在運行一段時間后才發現存在不能滿足要求需要調整,又不想丟棄這段時間的數據,那么就要進行字符集的修改。字符集的修改不能直接通過 “alter database character set ‘xxx” 或者”alter table table_name character set xxx”命令進行調整,這兩個命令都沒有更新已有記錄的字符集,而只是對新創建的表或者記錄生效。
字符集修改,需要先導出數據,經過適當的調整重新導入后才可完成。
下面模擬將latin1字符集的數據庫修改成utf8mb4字符集的數據庫。
1)導出表結構:
mysqldump –uroot –p –default-character-set=utf8mb4 –d database_name > createtab.sql;
-d 表示指導處表結構,不導出數據。
2)手工修改createtab.sql中表結構定義中的字符集為新字符集。
3)確保記錄不在更新,導出所有記錄(鎖表導出)
mysqldump –uroot –p –quick –no-create-info –extended-insert –default-character-set=latin1 database_name > data.sql
--quick 用於轉儲大的表。他強制mysqldump從服務器一次一行地檢索表中的行而不是一次檢索所有行,並在輸出前將他緩存在內存中。
--extended-insert 使用包括幾個values列表的多行insert 語法。這樣使轉儲文件更小,重載文件時可以加速插入。
--no-create-info 不導出建表語句
--default-character-set=latin1 按照原有的字符集導出所有數據
4)打開data.sql,將set names latin1修改成set names utf8mb4
5)使用新的字符集創建新的數據庫
create database databasename default charset utf8mb4;
6)創建表,執行createtab.sql
mysql –uroot –p database_name < createtab.sql
7)導入數據
mysql –uroot –p database_name < data.sql