亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2462 | 回復: 0
打印 上一主題 下一主題

mysql 字符編碼 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-11-28 18:12 |只看該作者 |倒序瀏覽
我們經(jīng)常在telnet終端操作MySQL數(shù)據(jù)庫時會遇到中文亂碼問題,這主要是因為字符集設(shè)定錯誤造成的。這里面涉及到好幾個地方的字符集設(shè)置,如果我們搞清楚它后面的原理,就可以很容易解決這些亂碼問題。
   在MySQL的客戶端上執(zhí)行一次查詢的過程一般是,在客戶端的提示符后面輸入一條SQL語句,回車,然后終端顯示出查詢的結(jié)果。這個過程中,只有終端和 三個MySQL的系統(tǒng)變量指定了正確的字符集,才能保證我們將一個正確的SQL語句送到服務(wù)器,然后服務(wù)器返回正確的結(jié)果,并且在終端正確顯示。
  三個MySQL的系統(tǒng)變量是:
 、character_set_client,終端字符集,告訴Server客戶端提交的SQL語句的編碼格式
 、character_set_connection,連接字符集,是服務(wù)器翻譯SQL語句時用到的編碼格式
  ③character_set_results,返回的結(jié)果集的字符集,是服務(wù)器返回結(jié)果集之前把結(jié)果集轉(zhuǎn)換成的編碼格式
  在MySQL終端通過執(zhí)行命令 show variables like 'char%'; 可以查看這幾個變量的值。這三個變量通常都設(shè)定為同一種字符集,用命令set names [charset name]; 就可以修改這三個變量的值。一般來說,只要你設(shè)定了能夠表示你的數(shù)據(jù)的字符集,你查詢的結(jié)果都可以在終端正確顯示。比如你在數(shù)據(jù)庫中存入了中文數(shù)據(jù),不管 存入時使用的什么字符集,你在終端即可以用set names命令設(shè)置為utf8,也可以設(shè)置為gbk編碼,只要你的終端顯示的字符集和你的設(shè)定一致就可以正確處理中文。
  舉個例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個編碼,表創(chuàng)建如下
  mysql> create table t1 ( c1 text not null ) character set utf8;
  用的字符是漢字“范”,gbk編碼為B7 B6,utf8編碼為E8 8C 83
  用下面的SQL語句插入數(shù)據(jù):
  mysql> insert into t1 values ('范');
  1、如果終端設(shè)置為utf8,并且執(zhí)行了 set names utf8,那么插入到數(shù)據(jù)庫中的就是“范”這個字的utf8編碼,這個過程中MySQL不需要做編碼轉(zhuǎn)換。寫入數(shù)據(jù)庫的內(nèi)容可以通過執(zhí)行 select hex( c1 ) from t1;得到數(shù)據(jù)的十六進制編碼來驗證。
   2、如果終端設(shè)置為utf8,并且執(zhí)行了set names gbk,那么執(zhí)行完這個插入操作后,寫入的二進制數(shù)據(jù)是E9 91 BC,這是漢字“鑼”的utf8編碼。這是因為,終端輸入的“范”用的是utf8編碼,而服務(wù)器以為終端發(fā)送過來的內(nèi)容是gbk編碼,所以在向t1表中插 入的時候進行了一次gbk到utf8的轉(zhuǎn)換,結(jié)果當然是錯誤的。
  3、如果終端設(shè)置為gbk,并且執(zhí)行 了set names gbk, 那么執(zhí)行完插入操作后,寫入t1的依然是“范”這個字的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會報出一個數(shù)據(jù)被截斷的警告。實際上,輸入終端的是“范”這個字符的gbk編碼B7 B6,而服務(wù)器被告知客戶端發(fā)過來的SQL語句是utf8編碼,所以在執(zhí)行過程中沒有做轉(zhuǎn)碼,直到插入數(shù)據(jù)的時候,發(fā)現(xiàn)B7 B6不符合utf8的編碼規(guī)則,給出了警告信息,實際插入的數(shù)據(jù)是3F 3F,也就是兩個問號。
  查詢的時候是同樣的道理,MySQL也是根據(jù)set names設(shè)定的字符集來對返回給客戶端的結(jié)果集做相應(yīng)的編碼轉(zhuǎn)換,如果轉(zhuǎn)換的結(jié)果和終端顯示的字符集一致,就能正確顯示,如果不一致就是亂碼。
  結(jié)論是,只要終端的字符集和set names指定的字符集一致就可以讓MySQL在處理過程中執(zhí)行正確的轉(zhuǎn)碼并且正確地顯示。
   另外,如果通過程序操作MySQL數(shù)據(jù)庫, 那么也需要事先執(zhí)行set names命令來指定程序希望輸出的字符集。比如,用程序從一個utf8編碼的數(shù)據(jù)庫向另外一個gbk編碼的數(shù)據(jù)庫進行數(shù)據(jù)遷移,在選取源數(shù)據(jù)庫數(shù)據(jù)之 前,需要執(zhí)行set names gbk,才能取到gbk編碼的數(shù)據(jù)。


本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/77727/showart_2106432.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP