最近在進行hive的元資料中文注釋的同步,遇到了mysql中文編碼是亂碼問題,現在總結一下mysql編碼的基本原理。
我們傳統意義上的說的編碼其實是指字符集,它包括兩個方面,一是儲存字元,二是對映關係,也就是真正的編碼,各種字符集的儲存字元都差不多,而編碼卻各不相同,是真正有威力的地方。
mysql的字符集有兩個概念,乙個是"character set(字符集)",乙個"collations".
先解釋一下collations,它譯成中文是"校檢",這個在mysql中使用主要是指導mysql對字元的比較,比如,ascii字符集裡,collations規定了a小於b,a等於a,以及a是否等於a之類的,通常基本可以忽略collations的存在,通常使用預設的字符集即可,預設字元可以選擇標準的或者慣用的。
另外乙個character set是乙個很廣的概念,在windows下的普通檔案,也涉及到字符集的問題,不同的字符集,規定了不同的字元編碼方式,我們來看看字符集的組成由兩部分:符號和編碼,例如,ascii字符集,包括符號:數字、大小寫、分號、換行等,編碼方式是用7bit表示乙個字元。ascii只規定了英文的字母編碼,非英文語言不能使用ascii編碼表示,為此不同國家,都為自己的語言做了編碼,比如我們國家,使用gb2312編碼。由於不同的國家都使用自己的編碼方式進行編碼,常常會導致一些跨平台的應用出現編碼問題,所以國際標準化組織考慮採用國際統一的通用編碼進行編碼,這裡最通用是utf8,ascii只對英文本元和英文本母進行了編碼,gb2312只對英文本元、英文本母、中文字元進行了編碼,utf8對世界上的基本所有常用的語言進行了編碼,故這種編碼方式是最廣泛的字符集。
總結一下,任何文字都會涉及到字符集的問題,字符集包括兩個關鍵部分:1、字元:漢字、英文本母、標點符號、拉丁文等。2、編碼:將字元轉換成計算機儲存的格式,比如,a用65表示。字符集就是用一組字元以及對應的編碼方式組成。
前面介紹了字符集和mysql中字符集和校檢,現在對mysql中的具體情況進行分析:
mysql目前支援多種字符集,並且可以支援字符集之間的轉換(但是需要注意字符集之間的轉換是否存在編碼丟失問題)
由於mysql中資料存放是分級的,故字符集在不同層級中有相對應的關係,包括伺服器級字符集、資料庫級字符集、資料表級字符集、表列級字符集,同時如果使用mysql的命令列還有客戶端級字符集(命令列可以通過加入選項default-character-set=*** 指定編碼方式),實際上最終使用的字符集是儲存字元的列,當然字符集是針對字元型別的列才會有效的,非字元型別比如int型別是無效的。
在實際應用中,伺服器->資料庫->表->表中的列,字符集是逐級作為預設字元的,即如果本級沒有指定字符集型別則會使用上一級的字符集型別作為預設型別作為自己的字符集,而伺服器中預設使用的是latin1作為編碼方式(哪國人發明自然使用哪國人的,可以理解)
針對具體應用時,mysql最好在設計資料庫表結構是對編碼進行統一的設定,如果資料庫已經有資料不希望重建,可以使用以下命令對編碼方式進行修改:
1、伺服器級的編碼方式修改暫時沒有提供
2、修改資料庫級編碼,如果是資料庫編碼不正確: 可以在命令列執行如下命令: alter database `test` default character set utf8 collate utf8_bin
以上命令就是將test資料庫的編碼設為utf8,collation為
utf8_bin
3、修改表的編碼:alter table `
test
` default character set utf8 collate utf8_bin
以上命令就是將乙個表
test
的編碼改為utf8
4、修改欄位的編碼:
alter table `test` change `oldfield` `newfield` varchar( 45 ) character set utf8 collate utf8_bin not null
以上命令就是將test表中
oldfield
的字段改為newfield
varchar( 45 ) 為字段屬性
編碼改為utf8
mysql中文編碼問題 解決Mysql中文亂碼問題
參考原文 我是在linux下用mysql5.6,通過程式向資料庫插入資料,debug時程式裡的中文是正常的,插入到資料庫後是亂碼 以下是我的修改步驟 1 命令 show variables like character 檢視資料庫編碼 顯示 variable name value character...
mysql編碼問題解決
首先需要在建立表的時候,將編碼規定。具體如下 create databasetest character set utf8 collate utf8 general ci engine innodb default charset utf8 補救措施 1.檢視預設編碼集 show variables...
MySQL中文亂碼問題解決
mysql 4.1及以後的版本開始支援多語言,這個所謂的多語言,就是在輸入輸出時mysql會替你做編碼轉換。而這個轉換規則就是由客戶端編碼和伺服器端編碼來決定的。編碼轉換的規則就是 在輸入資料時將編碼由 客戶端編碼 轉換為 伺服器端編碼 輸出時將資料由 伺服器端編碼 轉換為 客戶端編碼 mysql ...