[MySQL] 字符集的選擇


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


免責聲明!

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



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