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