1. 程式人生 > >MySQL字符集小結

MySQL字符集小結

gen roo def utf8mb4 nec git gb2 serve href

一:什麽是字符集

字符集支持多層面:服務器層(server)、數據庫層(database)、數據表(table)、字段(column)、連接(connect)、結果集(result)。
1.字符集是一套符號和編碼規則,字符串必須有相應的字符集。 2.校驗集是這套符號和編碼的校驗規則,定義字符排序規則,字符串之間比較的規則。 3.非ASCII字符在不同字符集中,其所需的字節數是不一樣的。 4.多字節字符間是以字符進行比較,而非以字節為單位比較。 5.個別校驗集是二進制的,基於字符對應的數值進行比較。 6.XXX_bin 將字符串中的每一個字符用二進制數據存儲,區分大小寫。 7.XXX_general_ci 不區分大小寫,ci為case insensitive的縮寫,即大小寫不敏感。 8.XXX_general_cs 區分大小寫, cs為case sensitive的縮寫,即大小寫敏感。 二:常用字符集介紹 (1):gbk/gb2312 1.gb2312是雙字節字符集,不論中、英字符均使用雙字節來表示,為了區分中文,將其最高位都設為1. 2.gb2312是gbk的子集,gbk是gb18030的子集。 3.gbk包括中日韓字符的大字符集合。 4.通常使用gbk字符集足夠。 5.國際通用性比utf8差,不過utf8占用的數據庫比gbk大(三字節字符集)。 6.gbk、gb2312等字符集與utf8之間必須通過unicode編碼才能互相轉換。 gbk、gb2312 => Unicode => utf8 utf8 => Unicode => gbk、gb2312 (2):utf8 1.8-bit Unicode Tuansformation Format,三字節字符集。 2.是Unicode的一種存儲方式,可變長度字符編碼,又稱萬國碼。 3.UTF-8使用可變長度字節來存儲 Unicode字符,例如ASCII字母繼續使用1個字節存儲,重音文字、希臘文字或西裏爾字母等使用2個字節來存儲,而常用的漢字就要使用3個字節。 4.數據庫字符集盡量使用UTF8(客戶端連接connect)及結果(result)字符集也采用UTF8字符集,最終HTML頁面亦是采用UTF8。 http://baike.baidu.com/view/25412.htm ASCII是7位字符集,但不能覆蓋歐洲語言中的特殊字符。 lantin1是7位字符集,但不能覆蓋亞洲,非洲語言。 unicode是lantin1的擴展,增加了亞洲、非洲常規語言支持,但仍不支持全部語言,且ASCII用unicode來表示效率不高。 utf8是unicode的擴展。 MySQL 4.x 版本及以前,CHAR(n)表示能存儲多少字節數,實際能存儲多少字符數和字符集沒有關系。 MySQL 4.x 之後的版本,CHAR(n)表示能存儲多少字符數,實際能存儲多少字符數和字符集有關系。 CHAR(30),UTF-8字符集,最大長度90byte,存儲了30個漢字,字節數應該是:90個字節 CHAR(30),UTF-8字符集,最大長度90byte,存儲了30個英文,字節數應該是:30個字節 CHAR(30),GBK字符集,最大長度60byte 存儲了30個漢字,字節數應該是:60個字節 CHAR(30),GBK字符集,最大長度60byte 存儲了30個英文,字節數應該是:30個字節 CHAR(30),LATIN1字符集,最大長度30byte存儲了15個漢字,字節數應該是:30個字節 CHAR(30),LATIN1字符集,最大長度30byte存儲了30個英文,字節數應該是:30個字節 三:如何轉換字符集 latin1轉換到utf8 gbk轉換到utf8 lantin1轉換到gbk lantin1字符集環境:LANG=en_US.ISO_8859 CRT:default gbk字符集環境:LANG=en_US.GBK/zh_CN.GBK CRT:default utf8字符集環境:LANG=en_US.UTF-8 CRT:utf8 1.latin1 =>utf8 以原來的字符集為latin1為例,升級成為utf8的字符集,原來的表:old_table(default charset=latin1),新表:new_table(defaul charset=utf8)。 第一步:導出舊數據 mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table> old.sql 第二步:轉換編碼(unix/linux環境下) iconv -t utf8 -f gb2312 -c old.sql >new.sql 或者去掉-f參數,讓iconv自動判斷原來的字符集 iconv -t utf-8 -c old.sql >new.sql 在這裏,假定原來的數據默認是gb2312編碼。 第三步:導入 修改new.sql,在插入/更新語句開始之前,增加一條SQL語句: SET NAMES utf8; mysqldump -hlocalhost -uroot -B my_db < new.sql 2.gbk => utf8 以原來的字符集為gbk為例,升級成為utf8字符集,原來的表old_table(default charset=gbk),新表:new_table(defalut charset=utf8) 第一步:導出舊數據 mysqldump --default-character-set=gbk -hlocalhost -uroot -B my_db --tables old_table> old.sql 第二步:轉換編碼(unix/linux環境下) iconv -t utf-8 -c old.sql >new.sql 或者去掉-f參數,讓iconv自動判斷原來的字符集 iconv -t utf-8 -c old.sql >new.sql 在這裏,假定原來的數據默認是gb2312編碼。 第三步:導入 修改new.sql,在插入/更新語句開始之前,增加一條SQL語句: SET NAMES utf8; mysqldump -hlocalhost -uroot my_db < new.sql 3.latin1 => gbk 以原來的字符集為gbk為例,升級成為utf8字符集,原來的表old_table(default charset=latin1),新表:new_table(defalut charset=utf8) 第一步:導出舊數據 mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table> old.sql 第二步:導入(省去了第二步轉換編碼工作) 修改new.sql,在插入/更新語句開始之前,增加一條SQL語句: SET NAMES gbk; mysqldump -hlocalhost -uroot my_db < new.sql


How to support full Unicode in MySQL databases
https://mathiasbynens.be/notes/mysql-utf8mb4

10分鐘學會理解和解決MySQL亂碼問題
http://cenalulu.github.io/mysql/mysql-mojibake/

字符集GBK和UTF8的區別說明
http://blog.csdn.net/zzxian/article/details/7330804

mysql使用utf8mb4經驗吐血總結
https://mp.weixin.qq.com/s?__biz=MzAwMDU2ODU3MA==&mid=2247484084&idx=1&sn=e3740e1087dc73ffcdc4b56bfeaaaa6d&chksm=9ae7bf21ad9036370e8174995ff73775a0ff8c8a51b9995fc8675a994a768a136d187e2aa76d#rd


MySQL字符集小結