字符集的選擇
1.若是數據庫只須要支持中文,數據量很大,性能要求也很高,應該選擇雙字節定長編碼的中文字符集(如GBK)。由於相對於UTF-8而言,GBK"較小",每一個漢字只佔2個字節,UTF-8的漢字佔3個字節。這樣能夠減小磁盤I/O、數據庫Cache以及網絡傳輸的時間,從而提升性能。
若是主要處理英文字符,僅有少許漢字數據,選擇UTF-8更好,由於GBK等英文字符編碼都是2字節,會形成不少沒必要要的開銷。
2.若是數據庫須要作大量的字符運算,如比較、排序等,選擇定長字符集更好。由於定長字符集處理速度比變長字符集速度快。
3.若是全部客戶端都支持某一個字符集,則應該選擇這個字符集做爲數據庫字符集。由於這樣能夠避免由於字符集轉換帶來的性能開銷和數據損失。
支持的字符集
查看全部可用的字符集
show character set;
查看全部字符集和該字符集默認的校對規則
desc information_schema.character_sets;
查看相關字符集的校對規則
show collation like 'gbk%';
校對規則命名
_ci(大小寫不敏感)
_cs(大小寫敏感)
_bin(基於字符編碼的值,與language無關)
測試'A'和'a'在_ci和_bin下是否相同
select case when 'A' collate gbk_chinese_ci = 'a' collate gbk_chinese_ci then 1 else 0 end;
select case when 'A' collate gbk_bin = 'a' collate gbk_bin then 1 else 0 end;
MySQL字符集的設置
MySQL字符集和校對規則有4個級別的默認設置:1.服務器級 2.數據庫級 3.表級 4.字段級
[服務器級]
在MySQL服務啓動時肯定:
1.在my.cnf中設置
character-set-server=gbk
2.在啓動選項中指定
mysqld --character-set-server=gbk
3.在編譯時指定
shell>cmake . -DDEFAULT_CHARSET=gbk
若是沒有特別指定服務器字符集,則默認使用latin1做爲服務器字符集。
若是沒有指定校對規則,則使用字符集的默認校對規則。
查詢當前服務器字符集和校對規則
show variables like 'character_set_server';
show variables like 'collation_server';
[數據庫級]
數據庫字符集的規則:
1.指定字符集沒有指定校對規則,則使用字符集的默認校對規則。
2.指定校對規則但未指定字符集,則使用與校對規則相關聯的字符集。
3.都未指定,則使用服務器級字符集和校對規則。
顯示當前數據庫字符集
show variables like 'character_set_database';
show variables like 'collation_database';
修改數據庫的字符集和校對規則
alter datebase 數據庫名 default character set 字符集 [collate 校對規則]
[表級]
顯示錶的字符集和校對規則
show create table 表名;
修改表的字符集和校對規則
alter table 表名 default character set 字符集 [collate 校對規則]
[字段級]
修改字段的字符集和校對規則
alter table 表名 change 字段名 字段新名 字段類型 character set 字符集 [collate 校對規則]
修改一張表中全部字段的字符集
alter table 表名 convert to character set 字符集 [collate 校對規則];
顯示字段的字符集和校對規則
show full columns from 表名;
定義字段索引時,須要在索引後加個逗號,否則會引發語法錯誤。
alter table t1 change name name varchar(255) not null,default character set utf8;
鏈接字符集和校對規則
對於服務器和客戶端的交互操做,MySQL提供了三個不一樣的參數:character_set_client,character_set_connection和character_set_results,分別表明客戶端、鏈接和返回結果的字符集。
一般狀況下,這三個字符集應該是相同的,才能夠保證用戶寫入的記錄刻意正確地讀出。
設置鏈接的字符集和校對規則,同時修改這3個參數的值
set names 字符集
在my.cnf中設置字符集(在服務啓動後,全部鏈接默認使用GBK字符集進行鏈接,而不須要執行set names gbk)
[mysql]
default-character-set=gbk
強制字符串的字符集和校對規則
[_字符集]'string'[collate 校對規則]
eg:
select _gbk '字符集';
字符集的修改步驟
將latin1改爲gbk
1.導出表結構。
mysqldump -uroot -p --default-character-set=gbk -d databasename>createtab.sql
--default-character-set=gbk :表示設置以什麼字符集鏈接
-d :只導出表結構,不導出數據
2.手工修改createtab.sql中表結構定義中的字符集爲新的字符集。
3.確保記錄再也不更新,導出全部記錄。
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql
4.打開data.sql,將set names latin1 修改爲 set names gbk。
5.使用新的字符集建立新的數據庫
create database databasename default charset gbk;
6.建立表,執行createtab.sql
mysql -uroot -p databasename<createtab.sql
7.導入數據,執行data.sql
mysql -uroot -p databasename<data.sql
--quick :該選項用於轉儲大的表。
--extended-insert :使用包括幾個values 列表中的多行insert 語法。這樣使轉儲文件更小,重載文件時能夠加速插入。
--no-create-info :不導出每一個轉儲表的create table 語句
--default-character-set=latin1 :按照原有的字符集導出全部數據,這樣導出的文件中,全部中文都是可見的,不會保存成亂碼。
1 row(s) affected, 1 warning(s): 1366 Incorrect string value: '\xE4\xBD\xA0\xE5\xA5\xBD' for column 'content' at row 1 0.078 sec
產生錯誤的緣由:
1.建立數據庫和數據表的時候未聲明字符集,因此使用了「默認字符集latin1」,在插入含有中文數據時產生警告。該數據會正常插入,但中文會保存爲亂碼。
2.使用alter datadase character set... 或者alter table tablename character set ...修改數據庫或數據表編碼。
這兩條語句沒法影響字段自己的編碼,因此字段依然是latin1編碼。
解決的辦法:
1.用"
alter table 表名 change 字段名 字段新名 字段類型 character set 字符集 [collate 校對規則] "來修改字段的字符集。
2.修改數據表的字符集,刪除舊字段,而後新建字段,這時新建的字段就是修改後的數據表字符集。
3.修改數據表的字符集, 可是原來的字段仍是latin1字符集。使用方法1修改字段字符集。