成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL怎么存文本不亂碼?

數據庫 MySQL
MySQL里怎么存儲那些看起來會亂碼的字符?我在“UTF8字符集的表怎么直接轉UTF8MB4”一文中介紹了如何把表字符集由UTF8直接轉換成UTF8MB4的幾種方法。

[[212774]]

導讀

MySQL里怎么存儲那些看起來會亂碼的字符?

我在“UTF8字符集的表怎么直接轉UTF8MB4”一文中介紹了如何把表字符集由UTF8直接轉換成UTF8MB4的幾種方法。

1、只修改字符集(使用默認校驗集)

  1. yejr@imysql.com> alter table t1 convert to character set utf8mb4 

2、同時修改表字符集和校驗集

  1. yejr@imysql.com> alter table t1 convert to  character set utf8mb4 collate utf8mb4_bin; 

3、只修改某列的字符集

  1. yejr@imysql.com> alter table t1 modify c1 varchar(20)  character set utf8mb4 not null default ‘’ 

4、同時修改某列的字符集和校驗集
 

 

  1. yejr@imysql.com> alter table t1 modify c1 varchar(20)  character set utf8mb4  collate utf8mb4_unicode_ci  not null default ‘’ 

好了,有個字符集為UTF8MB4的表中想存儲各類不同字符集的文本,有哪些注意事項億避免亂碼?

如果是通過WEB接口存儲數據,則建議在browser端、server端全都采用UTF8字符集,MySQL Server端采用UTF8/UTF8MB4均可(針對大多數文本,其實UTF8字符集就足夠存儲的了)。

其中,MySQL端的字符集設置比較讓人頭大,涉及到的字符集有好幾個:

  • character_set_server,server端默認字符集;
  • character_set_database,database默認字符集,若未設定,則和 character_set_server 的設定一樣;database中的 數據表/stored procedure/stored function 也可以自行設定字符集,若未指定,則和 character_set_database 的設置一樣;數據表中的字符類型列,也可以單獨設定字符集,若未設定,則和該表指定的字符集一樣;
  • character_set_client,客戶端顯示讀取結果的字符集;
  • character_set_connection,客戶端從server端讀取數據時傳輸字符集;
  • character_set_results,server端將數據發送給客戶端時的字符集;

可見,涉及到字符集的因素實在太多,因此我們強烈建議各個環節全部采用同一種字符集,避免出現意外狀況。

MySQL采用UTF8MB4字符集時,存儲文本實際消耗字節數是由文本內容的字節數決定的,并非總是需要4字節,列舉幾種情況:

  • 輸入字符集任意,且存儲ASCII字符時,每個字符需要1byte;
  • 輸入字符集是GB2312,且存儲的字符是漢字時,每個字符需要2bytes;
  • 輸入字符集是UTF8/UTF8MB4,且存儲的字符是低編碼漢字時,每個字符需要3bytes;
  • 輸入字符集是UTF8/UTF8MB4,且存儲的字符是高編碼漢字時,每個字符需要4bytes;
  • 輸入字符集是binary,且存儲的字符是高編碼漢字時,每個字符需要4bytes;

總結建議

  1. 從前端到后端(瀏覽器=>WEB Server=>MySQL連接層=>Server層=>DB層>TABLE層),盡可能使用同一種字符集;
  2. 盡可能采用大字符集,也就是優先級:UTF8Mb4 > UTF8 > GBK > LATIN1;
  3. 采用邏輯備份數據時,切記要不定期進行恢復測試,我以前在這方面栽過一次,教訓慘痛。

附1,關于編碼簡介

  • ASCII碼,占7bit,由128個字符組成,包括大小寫字母、數字0-9、標點符號、非打印字符(換行符、制表符等4個)以及控制字符(退格、響鈴等)組成;
  • latin1,占1byte,在ASCII基礎上,增加128 ~ 255區間的字符;
  • GB2312等CJK字符集,可變長字符集,最多占2bytes,用于存儲常見的CJK字符;
  • UTF8,可變長字符集,最多占3bytes,可以囊括ASCII、CJK及其他絕大多數常用語言文字;這中間其實還有個UNICODE字符集,它也是2bytes的,也能囊括ASCII字符,但即便是ASCII字符也需要消耗2bytes,存在一定浪費,而用UTF8存儲ASCII字符時,實際只需要1byte,更為節省存儲空間;
  • UTF8MB4,可變長字符集,最多占4bytes,可以包含上面其他幾種字符集;同樣地,以UTF8MB4存儲ASCII字符時,實際上也是只占用1bytes,存儲一般的漢字占用3bytes,而存儲個別漢字則需要4bytes,存儲emoji也至少需要4bytes;

附2,字符集兼容在線測試

為了方便大家,我寫了個簡單的PHP接口供測試,可以提交一些不常見的漢字,或者emoji表情符,看看是否都能正常顯示。

開發這個接口時,發現釘釘中的個別表情符是由2個4字節編碼組成的,也就是說一個emoji表情符,其實是需要8個字節的。

這個接口***輸出的格式是:

字符串 : 字節數

比如 "a齒a : 5" ,表示 "a齒a" 這個字符串共消耗 5個字節,因為 "齒" 其實只需要3個字節來存儲,雖然看起來挺大一坨的。

相應的代碼如下:

 

  1. select vchar, length(vchar) as vcharlen 

測試接口鏈接: utf8mb4字符集兼容性測試接口

如果想要寫入4字節的漢字,可以從龍泉寺提供的字庫拷貝過來,或者插入emoji表情符。

參考及延伸閱讀

 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2013-03-29 11:16:17

2024-02-23 11:09:44

AI模型

2011-05-16 10:31:19

mysql亂碼

2010-03-12 18:22:51

Python文本亂碼

2022-07-16 10:02:54

gedit文本編輯器Linux

2010-06-01 17:01:07

MySQL編碼機制

2010-05-25 11:33:27

MySQL亂碼

2022-01-26 19:42:05

MySQL亂碼排查

2016-06-20 10:10:54

MulteFire/無

2010-06-09 16:46:37

MySQL 亂碼處理

2010-06-11 17:06:44

MySQL EMS

2011-03-22 16:09:33

MySQL 5.0.1亂碼

2010-01-07 17:35:03

Ubuntu mysq

2012-02-07 13:27:03

HibernateJava

2009-06-19 14:54:35

JavaMySQL中文亂碼

2022-05-06 09:48:56

機器學習樣本不平衡

2011-07-05 11:14:41

噴墨打印機推薦

2024-07-26 00:00:20

2010-05-14 17:27:40

MySQL中文亂碼

2010-05-17 14:49:43

MySQL中文亂碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久一区二区三区 | 亚洲精品电影网在线观看 | www国产精品 | 国产精品久久久久久久久久久久午夜片 | 欧美国产日韩在线观看 | 国产精品一区视频 | 91精品国产综合久久香蕉麻豆 | 91网站视频在线观看 | 国产综合在线视频 | 日韩欧美国产综合 | 1000部精品久久久久久久久 | 亚洲 一区| 在线观看av不卡 | 一区二区在线免费播放 | 成人国产精品久久 | 大吊一区二区 | 亚洲精品久久区二区三区蜜桃臀 | 羞羞色影院 | 成人国产在线观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 亚洲欧美在线视频 | 一区二区在线 | 欧美精品v国产精品v日韩精品 | 国产精品精品久久久 | 日韩av一区二区在线观看 | 亚洲综合久久精品 | 婷婷色成人 | 欧洲一级黄 | 欧美精品乱码99久久影院 | 久久久久国产精品一区二区 | 免费成人高清在线视频 | 成人免费视频网站在线看 | 久久精品中文 | 日韩毛片 | 国产99久久精品一区二区永久免费 | www.亚洲一区 | 亚洲一二三视频 | 日本在线你懂的 | 亚洲黄色一级毛片 | 精品视频一区二区三区 | 91亚洲一区|