《MYSQL教程mysql字符編碼設(shè)置問題》要點(diǎn):
本文介紹了MYSQL教程mysql字符編碼設(shè)置問題,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MYSQL學(xué)習(xí)在telnet終端操作mysql數(shù)據(jù)庫時(shí)會(huì)遇到中文亂碼問題,是由于字符集設(shè)定錯(cuò)誤造成的.
涉及到好幾個(gè)地方的字符集設(shè)置,如果搞清楚它后面的原理,就可以很容易辦理這些亂碼問題.
MYSQL學(xué)習(xí)在mysql的客戶端上執(zhí)行一次查詢的過程一般是,在客戶端的提示符后面輸入一條sql語句,回車,然后終端顯示出查詢的結(jié)果.
這個(gè)過程中,只有終端和 三個(gè)mysql的系統(tǒng)變量指定了正確的字符集,才能保證將一個(gè)正確的sql語句送到服務(wù)器,然后服務(wù)器返回正確的結(jié)果,并且在終端正確顯示.
MYSQL學(xué)習(xí)三個(gè)mysql的系統(tǒng)變量是:
①character_set_client,終端字符集,告訴server客戶端提交的sql語句的編碼格式
②character_set_connection,連接字符集,是服務(wù)器翻譯sql語句時(shí)用到的編碼格式
③character_set_results,返回的結(jié)果集的字符集,是服務(wù)器返回結(jié)果集之前把結(jié)果集轉(zhuǎn)換成的編碼格式
在mysql終端通過執(zhí)行命令 show variables like 'char%';可以查看這幾個(gè)變量的值.這三個(gè)變量通常都設(shè)定為同一種字符集,用命令set names [charset name]; 就可以修改這三個(gè)變量的值.
MYSQL學(xué)習(xí)一般來說,只要設(shè)定了能夠表示數(shù)據(jù)的字符集,查詢的結(jié)果都可以在終端正確顯示.好比在數(shù)據(jù)庫中存入了中文數(shù)據(jù),不管 存入時(shí)使用的什么字符集,在終端即可以用set names命令設(shè)置為utf8,也可以設(shè)置為gbk編碼,只要的終端顯示的字符集和的設(shè)定一致就可以正確處理中文.
MYSQL學(xué)習(xí)例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個(gè)編碼,表創(chuàng)建如下
?
MYSQL學(xué)習(xí)插入數(shù)據(jù):
mysql> insert into t1 values ('范');
1、如果終端設(shè)置為utf8,并且執(zhí)行了 set names utf8,那么插入到數(shù)據(jù)庫中的就是“范”這個(gè)字的utf8編碼,這個(gè)過程中mysql不需要做編碼轉(zhuǎn)換.寫入數(shù)據(jù)庫的內(nèi)容可以通過執(zhí)行 select hex( c1 ) from t1;得到數(shù)據(jù)的十六進(jìn)制編碼來驗(yàn)證.
2、如果終端設(shè)置為utf8,并且執(zhí)行了set names gbk,那么執(zhí)行完這個(gè)插入操作后,寫入的二進(jìn)制數(shù)據(jù)是e9 91 bc,這是漢字“鑼”的utf8編碼.這是因?yàn)?終端輸入的“范”用的是utf8編碼,而服務(wù)器以為終端發(fā)送過來的內(nèi)容是gbk編碼,所以在向t1表中插 入時(shí)進(jìn)行了一次gbk到utf8的轉(zhuǎn)換,結(jié)果當(dāng)然是錯(cuò)誤的.
3、如果終端設(shè)置為gbk,并且執(zhí)行 了set names gbk, 那么執(zhí)行完插入操作后,寫入t1的依然是“范”這個(gè)字的utf8編碼.插入過程中,終端輸入的是“范”的gbk編碼b7 b6,服務(wù)器被告知終端發(fā)過來的sql語句是gbk編碼(由character_set_client指定),所以在插入數(shù)據(jù)前做了一次gbk到utf8 的編碼轉(zhuǎn)換.
4、如果終端設(shè)置為gbk,并且執(zhí)行了set names utf8,那么執(zhí)行完插入操作后,mysql會(huì)報(bào)出一個(gè)數(shù)據(jù)被截?cái)嗟木?實(shí)際上,輸入終端的是“范”這個(gè)字符的gbk編碼b7 b6,而服務(wù)器被告知客戶端發(fā)過來的sql語句是utf8編碼,所以在執(zhí)行過程中沒有做轉(zhuǎn)碼,直到插入數(shù)據(jù)時(shí),發(fā)現(xiàn)b7 b6不符合utf8的編碼規(guī)則,給出了警告信息,實(shí)際插入的數(shù)據(jù)是3f 3f,也就是兩個(gè)問號(hào).
查詢時(shí)是同樣的道理,mysql也是根據(jù)set names設(shè)定的字符集來對(duì)返回給客戶端的結(jié)果集做相應(yīng)的編碼轉(zhuǎn)換,如果轉(zhuǎn)換的結(jié)果和終端顯示的字符集一致,就能正確顯示,如果不一致就是亂碼.
結(jié)論是,只要終端的字符集和set names指定的字符集一致就可以讓mysql在處理過程中執(zhí)行正確的轉(zhuǎn)碼并且正確地顯示.
? 另外,如果通過程序操作mysql數(shù)據(jù)庫, 那么也需要事先執(zhí)行set names命令來指定程序希望輸出的字符集.
好比,用程序從一個(gè)utf8編碼的數(shù)據(jù)庫向另外一個(gè)gbk編碼的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)遷移,在選取源數(shù)據(jù)庫數(shù)據(jù)之前,需要執(zhí)行set names gbk,才能取到gbk編碼的數(shù)據(jù).
《MYSQL教程mysql字符編碼設(shè)置問題》是否對(duì)您有啟發(fā),歡迎查看更多與《MYSQL教程mysql字符編碼設(shè)置問題》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/7427.html