數(shù)據(jù)庫(kù)中關(guān)于字符集的種類(lèi)有很多,個(gè)人建議,數(shù)據(jù)庫(kù)字符集盡量使用utf8(utf-8),以使你的數(shù)據(jù)能很順利的實(shí)現(xiàn)遷移,因?yàn)閡tf8字符集是目前最適合于實(shí)現(xiàn)多種不同字符集之間的轉(zhuǎn)換的字符集,盡管你在命令行工具上無(wú)法正確查看數(shù)據(jù)庫(kù)中的內(nèi)容,我依然強(qiáng)烈建議使用utf8作為默認(rèn)字符集.如果你想使用gb2312編碼,那么建議你使用latin1作為數(shù)據(jù)表的默認(rèn)字符集,這樣就能直接用中文在命令行工具中插入數(shù)據(jù),并且可以直接顯示出來(lái).而不要使用gb2312或者gbk等字符集,如果擔(dān)心查詢(xún)排序等問(wèn)題,可以使用binary屬性約束 對(duì)編程有影響的主要是客戶(hù)端字符集和數(shù)據(jù)庫(kù)字符集(還有一個(gè)服務(wù)器字符集,不知道干什么用的), 數(shù)據(jù)庫(kù)中常用的操作就是保存數(shù)據(jù)和讀取數(shù)據(jù),在這過(guò)程中,亂不亂碼和數(shù)據(jù)庫(kù)字符集貌似沒(méi)有什么關(guān)系。我們只要保證寫(xiě)入時(shí)選擇的字符集和讀取時(shí)選擇的字符集一致,即只需保證兩次操作的客戶(hù)端字符集一致即可。 在mysql的客戶(hù)端上執(zhí)行一次查詢(xún)的過(guò)程一般是,在客戶(hù)端的提示符后面輸入一條SQL語(yǔ)句,回車(chē),然后終端顯示出查詢(xún)的結(jié)果。這個(gè)過(guò)程中,只有終端和三個(gè)MySQL的系統(tǒng)變量指定了正確的字符集,才能保證我們將一個(gè)正確的SQL語(yǔ)句送到服務(wù)器,然后服務(wù)器返回正確的結(jié)果,并且在終端正確顯示。 三個(gè)MySQL的系統(tǒng)變量是: 1. character_set_client,終端字符集,告訴Server客戶(hù)端提交的SQL語(yǔ)句的編碼格式 2. character_set_connection,連接字符集,是服務(wù)器翻譯SQL語(yǔ)句時(shí)用到的編碼格式 3. character_set_results,返回的結(jié)果集的字符集,是服務(wù)器返回結(jié)果集之前把結(jié)果集轉(zhuǎn)換成的編碼格式 在MySQL終端通過(guò)執(zhí)行命令 show variables like ‘char%’ 可以查看這幾個(gè)變量的值。這三個(gè)變量通常都設(shè)定為同一種字符集,用命令set names [charset name]就可以修改這三個(gè)變量的值。一般來(lái)說(shuō),只要你設(shè)定了能夠表示你的數(shù)據(jù)的字符集,你查詢(xún)的結(jié)果都可以在終端正確顯示。 舉個(gè)例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個(gè)編碼,表創(chuàng)建如下 mysql> create table t1 ( c1 text not null ) character set utf8; 用的字符是漢字“范”,gbk編碼為B7 B6,utf8編碼為E8 8C 83 用下面的SQL語(yǔ)句插入數(shù)據(jù) mysql> insert into t1 values( ‘范’); a)如果終端設(shè)置為utf8,并且執(zhí)行了 set names utf8,那么插入到數(shù)據(jù)庫(kù)中的就是“范”這個(gè)字的utf8編碼,這個(gè)過(guò)程中MySQL不需要做編碼轉(zhuǎn)換。寫(xiě)入數(shù)據(jù)庫(kù)的內(nèi)容可以通過(guò)執(zhí)行 select hex( c1 ) from t1 得到數(shù)據(jù)的十六進(jìn)制編碼來(lái)驗(yàn)證。 b)如果終端設(shè)置為 utf8,并且執(zhí)行了set names gbk,那么執(zhí)行完這個(gè)插入操作后,寫(xiě)入的二進(jìn)制數(shù)據(jù)是E9 91 BC,這是“漢字“鑼”的utf8編碼。這是因?yàn)椋K端輸入的“范”用的是utf8編碼,而服務(wù)器以為終端發(fā)送過(guò)來(lái)的內(nèi)容是gbk編碼,所以在向t1表中插入的時(shí)候進(jìn)行了一次gbk到utf8的轉(zhuǎn)換,結(jié)果當(dāng)然是錯(cuò)誤的。 c)如果終端設(shè)置為gbk,并且執(zhí)行了set names gbk,那么執(zhí)行完插入操作后,寫(xiě)入t1的依然是“范”這個(gè)字的utf8編碼。插入過(guò)程中,終端輸入的是“范”的gbk編碼B7 B6,服務(wù)器被告知終端發(fā)過(guò)來(lái)的SQL語(yǔ)句是gbk編碼(由character_set_client指定),所以在插入數(shù)據(jù)前做了一次gbk到utf8的編碼轉(zhuǎn)換。 d)如果終端設(shè)置為gbk,并且執(zhí)行了set names utf8,那么執(zhí)行完插入操作后,MySQL會(huì)報(bào)出一個(gè)數(shù)據(jù)被截?cái)嗟木妗?shí)際上,輸入終端的是“范”這個(gè)字符的gbk編碼B7 B6,而服務(wù)器被告知客戶(hù)端發(fā)過(guò)來(lái)的SQL語(yǔ)句是utf8編碼,所以在執(zhí)行過(guò)程中沒(méi)有做轉(zhuǎn)碼,直到插入數(shù)據(jù)的時(shí)候,發(fā)現(xiàn)B7 B6不符合utf8的編碼規(guī)則,給出了警告信息,實(shí)際插入的數(shù)據(jù)是3F 3F,也就是兩個(gè)問(wèn)號(hào)。 查詢(xún)的時(shí)候是同樣的道理,MySQL也是根據(jù)set names設(shè)定的字符集來(lái)對(duì)返回給客戶(hù)端的結(jié)果集做相應(yīng)的編碼轉(zhuǎn)換,如果轉(zhuǎn)換的結(jié)果和終端顯示的字符集一致,就能正確顯示,如果不一致就是亂碼。 結(jié)論是,只要終端的字符集和set names指定的字符集一致就可以讓MySQL在處理過(guò)程中執(zhí)行正確的轉(zhuǎn)碼并且正確地顯示。 另外,如果通過(guò)程序操作mysql數(shù)據(jù)庫(kù), 那么也需要事先執(zhí)行set names命令來(lái)指定程序希望輸出的字符集。比如,用程序從一個(gè)utf8編碼的數(shù)據(jù)庫(kù)向另外一個(gè)gbk編碼的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)遷移,在選取源數(shù)據(jù)庫(kù)數(shù)據(jù)之前,需要執(zhí)行set names gbk,才能取到gbk編碼的數(shù)據(jù)。
網(wǎng)站導(dǎo)航
- zblogPHP模板zbpkf
- zblog免費(fèi)模板zblogfree
- zblog模板學(xué)習(xí)zblogxuexi
- zblogPHP仿站zbpfang
查詢(xún)變量mysql,mysql數(shù)據(jù)庫(kù)使用的是什么字符集?