字元集是一套文字元號及其編碼,比較規則的集合。第一個字元集是ascll(american standard code for information interchange)。 1. 選擇合適的字元集 對於資料庫來說,字元集很重要,因為資料庫存儲的數據大部分是各種文字,字元集對資料庫的存儲,處理性能 ...
字元集是一套文字元號及其編碼,比較規則的集合。第一個字元集是ascll(american standard code for information interchange)。
1. 選擇合適的字元集
對於資料庫來說,字元集很重要,因為資料庫存儲的數據大部分是各種文字,字元集對資料庫的存儲,處理性能,以及日後系統的移植,推廣都有會影響
如何選擇呢?
UTF-8: 如果應用要處理各種各樣的文字,或將發佈使用不同語言的國家或地區,就應該選擇 Unicode字元集,對於mysql 目前就是UTF-8。如果主要處理英文字元,僅有少量漢字數據,那麼選擇utf-8更好。因為gbk,ucs-2,utf-16對西文字元編碼都是2位元組,會造成不必要的開銷。
GBK: 如果資料庫只需要支持一般中文,數據量很大,性能要求也很高,那應該選擇雙位元組定長編碼的中文字元集GBK。相對於uft-8而言,gbk比較“小”,每個漢字只占2個位元組,而utf-8漢字編碼需要3個位元組,這樣可以減少磁碟I/0, 資料庫緩存,以及網路傳輸的時間。
如果資料庫需要做大量的字元運算,如比較,排序等,選擇定長的字元集可能更好,因為定長字元集比變長處理速度快。如gbk固定雙位元組,utf-32固定4位元組。
客戶端程式使用的字元集, 在資料庫端應優先選擇該字元集,避免因字元集轉換帶來性能開銷和數據損失。
2. mysql 字元集
mysql 支持幾十種字元集。 如下圖所示:
SHOW CHARACTER SET;
3. mysql字元集的設置
有4個級別的預設設置:伺服器級,資料庫級,表級,欄位級。
3.1 在伺服器級,對my.cnf設置,在啟動mysql服務
3.2 資料庫級
如果資料庫中已有記錄,修改字元集對原有的記錄並沒有影響,只對新記錄使用。
-- 查看當前資料庫字元集 SHOW VARIABLES LIKE 'character%';
-- 修改資料庫字元集 ALTER DATABASE 資料庫名 CHARACTER SET utf8;
3.3 表級
可以通過alter table來修改,如果表中已有記錄,修改字元集對原有的記錄並沒有影響,只對新記錄使用。
-- 查看 SHOW CREATE TABLE t;
-- 修改表的字元集 ALTER TABLE 表名 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
3.4 列級
這種控制一般機率比較小,只是給我們提供了一個靈活設置的手段。
4 字元集修改
如果在應用開始階段沒有正確設置字元集,在運行一段時間後發現不能滿足要求需要調整,這時不能通過alter database character set 或alter tablename character set
命令進行,因為這兩個命令都不會更新已有記錄的字元集,對於已有的記錄的字元集調整,需要先將數據導出,經過適當的調整重新導入後才完成。
需要使用mysqldump工具來做導出導入,這裡就不在演示只標記下:
以下是將iatin1字元集的資料庫修改成GBK字元集的資料庫過程 4.1 導出表結構: mysqldump -uroot -p --default-character-set=gbk -d databasename> createtab.sql 4.2導出數據 mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename> data.sql 4.3 打開data.sql 將set names iatin1 修改成set names gbk 4.4 使用新的字元集創建新的資料庫 create database databasename default charset gbk; 4.5創建表 ,執行createtab.sql mysql -uroot -p databasename < createtab.sql 4.6導入數據,執行data.sql mysql -uroot -p databasename < data.sql