當前位置:編程學習大全網 - 編程語言 - mysql數據庫表裏中文亂碼應該選哪種編碼?

mysql數據庫表裏中文亂碼應該選哪種編碼?

數據庫中關於字符集的種類有很多,個人建議,數據庫字符集盡量使用utf8(utf-8),以使妳的數據能很順利的實現遷移,因為utf8字符集是目前最適合於實現多種不同字符集之間的轉換的字符集,盡管妳在命令行工具上無法正確查看數據庫中的內容,我依然強烈建議使用utf8作為默認字符集.如果妳想使用gb2312編碼,那麽建議妳使用latin1作為數據表的默認字符集,這樣就能直接用中文在命令行工具中插入數據,並且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔心查詢排序等問題,可以使用binary屬性約束 對編程有影響的主要是客戶端字符集和數據庫字符集(還有壹個服務器字符集,不知道幹什麽用的), 數據庫中常用的操作就是保存數據和讀取數據,在這過程中,亂不亂碼和數據庫字符集貌似沒有什麽關系。我們只要保證寫入時選擇的字符集和讀取時選擇的字符集壹致,即只需保證兩次操作的客戶端字符集壹致即可。 \x0d\在MySQL的客戶端上執行壹次查詢的過程壹般是,在客戶端的提示符後面輸入壹條SQL語句,回車,然後終端顯示出查詢的結果。這個過程中,只有終端和三個MySQL的系統變量指定了正確的字符集,才能保證我們將壹個正確的SQL語句送到服務器,然後服務器返回正確的結果,並且在終端正確顯示。 \x0d\三個MySQL的系統變量是: \x0d\1. character_set_client,終端字符集,告訴Server客戶端提交的SQL語句的編碼格式 \x0d\2. character_set_connection,連接字符集,是服務器翻譯SQL語句時用到的編碼格式 \x0d\3. character_set_results,返回的結果集的字符集,是服務器返回結果集之前把結果集轉換成的編碼格式 \x0d\在MySQL終端通過執行命令 show variables like ‘char%’ 可以查看這幾個變量的值。這三個變量通常都設定為同壹種字符集,用命令set names [charset name]就可以修改這三個變量的值。壹般來說,只要妳設定了能夠表示妳的數據的字符集,妳查詢的結果都可以在終端正確顯示。 \x0d\舉個例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個編碼,表創建如下 \x0d\mysql> create table t1 ( c1 text not null ) character set utf8; \x0d\用的字符是漢字“範”,gbk編碼為B7 B6,utf8編碼為E8 8C 83 \x0d\用下面的SQL語句插入數據 \x0d\mysql> insert into t1 values( ‘範’); \x0d\a)如果終端設置為utf8,並且執行了 set names utf8,那麽插入到數據庫中的就是“範”這個字的utf8編碼,這個過程中MySQL不需要做編碼轉換。寫入數據庫的內容可以通過執行 select hex( c1 ) from t1 得到數據的十六進制編碼來驗證。 \x0d\\x0d\b)如果終端設置為 utf8,並且執行了set names gbk,那麽執行完這個插入操作後,寫入的二進制數據是E9 91 BC,這是“漢字“鑼”的utf8編碼。這是因為,終端輸入的“範”用的是utf8編碼,而服務器以為終端發送過來的內容是gbk編碼,所以在向t1表中插入的時候進行了壹次gbk到utf8的轉換,結果當然是錯誤的。 \x0d\\x0d\c)如果終端設置為gbk,並且執行了set names gbk,那麽執行完插入操作後,寫入t1的依然是“範”這個字的utf8編碼。插入過程中,終端輸入的是“範”的gbk編碼B7 B6,服務器被告知終端發過來的SQL語句是gbk編碼(由character_set_client指定),所以在插入數據前做了壹次gbk到utf8的編碼轉換。 \x0d\\x0d\d)如果終端設置為gbk,並且執行了set names utf8,那麽執行完插入操作後,MySQL會報出壹個數據被截斷的警告。實際上,輸入終端的是“範”這個字符的gbk編碼B7 B6,而服務器被告知客戶端發過來的SQL語句是utf8編碼,所以在執行過程中沒有做轉碼,直到插入數據的時候,發現B7 B6不符合utf8的編碼規則,給出了警告信息,實際插入的數據是3F 3F,也就是兩個問號。 \x0d\\x0d\查詢的時候是同樣的道理,MySQL也是根據set names設定的字符集來對返回給客戶端的結果集做相應的編碼轉換,如果轉換的結果和終端顯示的字符集壹致,就能正確顯示,如果不壹致就是亂碼。 \x0d\\x0d\結論是,只要終端的字符集和set names指定的字符集壹致就可以讓MySQL在處理過程中執行正確的轉碼並且正確地顯示。 \x0d\\x0d\另外,如果通過程序操作MySQL數據庫, 那麽也需要事先執行set names命令來指定程序希望輸出的字符集。比如,用程序從壹個utf8編碼的數據庫向另外壹個gbk編碼的數據庫進行數據遷移,在選取源數據庫數據之前,需要執行set names gbk,才能取到gbk編碼的數據。

  • 上一篇:excel用宏命令VBA新建並打開壹個新的excel?
  • 下一篇:yy是什麽意思
  • copyright 2024編程學習大全網