MySql:charset和collation的設置
charset 和 collation 有多個級別的設置:服務器級、數據庫級、表級、列級和連接級
1.服務器級
查看設置:show global variables like 'character_set_server'; 和 show global variables like 'collation_server';
修改設置:在OPTION FILE (/etc/mysql/my.cnf)里設置:
[mysqld]
character_set_server=utf8
collation_server=utf8_general_ci
2. 數據庫級
查看設置:select * from information_schema.schemata where schema_name = 'cookbook';
設置:
1.若沒有顯式設置,則自動使用服務器級的配置
2.顯式設置:在創建庫時指定
create database playUtf8 DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
3.表級
查看設置:show create table course;
設置:
1.若沒有顯式設置,則自動使用數據庫級的配置
2.顯式設置:在創建表時指定
create table utf ( id int ) default charset=utf8 default collate=utf8_bin;
4.列級
查看設置:show create table course;
設置:
1.若沒有顯式設置,則自動使用表級的配置
2.顯式設置:
CREATE TABLE Table1(column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci);
5.連接級別
查看設置:
show variables like 'character_set_client'; # 服務端使用這個編碼來理解客戶端發來的statements
show variables like 'character_set_connection' ; # 我還不知道什么意思,等看了mysql源碼再說
show variables like 'character_set_results'; # 服務端使用這個編碼回送結果集和錯誤信息
設置:
客戶端在連接時可以指定這些參數;同時,服務端也提供了一個Global范圍的值,客戶端未指定這些參數時,服務端就使用這個Global值。這個global值怎么設置的? 我查遍了很多文檔,似乎還沒看到設置的辦法 (有人說通過my.cnf,或者在啟動mysqld時指定命令行參數,其實都是錯的)
附:connector/j傳輸SQL時用什么編碼?
答案: "The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server using the character_set_server system variable for server versions 4.1.0 and newer."
也就是說,是在連接時查詢服務器端的character_set_server值,再確定連接將使用的編碼。
不過,官方文檔還說,"要想覆蓋客戶端上的自動檢測編碼功能,可在用于連接到服務器的URL中使用“characterEncoding”屬性。"
bitsCN.com聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com