Mysql

僅使用 ASCII 字元時,MySQL 8 ASCII 與 utf8mb4_0900_ai_ci 大小是否不同?

  • June 13, 2020

如果我只使用 ASCII 字元,磁碟上的字元會比VARCHAR (255)使用ASCII 大嗎?utf8mb4_0900_ai_ci``VARCHAR (255)

小提琴是錯的。

あ A い I う U え E お O.

聲明客戶端以 utf8(或 utf8mb4)編碼時為 20 個字元/40 個字節。但是,如果您聲稱它在 latin1 中,它會導致 Mojibake 或“雙重編碼”,因此 Fiddle 顯示的是 30 和 48。

あ A い I う U え E お O.  --> E38182 41 E38184 49 E38186 55 E38188 45 E3818A 4F 2E

有關問題的進一步討論,請參閱https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored中的“雙重編碼” 。我沒有“修復”小提琴的原始碼。

也就是說,E38182是平假名字母 A 的 3 個十六進製字節:

但是,如果您將 E38182(等)視為 latin1,它會顯示為ã‚ A ã„ I ㆠU ㈠E ㊠O.. 然後,如果你再次轉換為 utf8,你會得到

C3A3 C281 E2809A 20 41 20 C3A3 C281 E2809E 20 49 20 ...

您仍然可以辨識空格 (20)、A (41)、I (49) 等,但平假名字元已損壞。

您在 Fiddle 中看不到雙重編碼,因為瀏覽器“足夠好”可以“修復”您的錯誤。(這使得弄清楚出了什麼問題非常可怕。)

中文十六進制為 E683B3 E79C8B E4BB80 E9A0AD E6B885 E58FAA E582B7 E7B2BE EFBC8C E4B8AD E7BE8E E8A780 E79A84 E68EA5 E5A794 E4B8BB E58091 E8AA8D E58FAF E69893 E7095AB E7AD89 E5BA58

(最後的標籤 (09) 可能是格式的人工製品。)

雙編碼以 C3A6 C692 C2B3 開頭(來自 EF、BC、8C) C3A7 C593 E280B9 C3A4 C2BB E282AC C3A9 C2A0 C2AD C3A6 C2B8 E280A6

回到標題問題——即使你只使用 ascii,也有細微的差別。

您可能不會遇到任何可測量的差異。這裡有一些可能性。

  • 某些臨時表操作可能會更快達到限制。(這個問題在 5.7 中存在,但在 8.0 中可能已經被消除,現在在建構臨時表時變成了這個問題。VARCHARCHAR
  • 我還沒有看到一個基準測試表明 utf8mb4 的 ascii 文本排序與 latin1 或 ascii 一樣快或不如CHARACTER SETlatin1 或 ascii 快。
  • CHARSET utf8mb4 的索引限制比 CHARSET ascii 短。他們可能是VARCHAR(3072)對的VARCHAR(768)

引用自:https://dba.stackexchange.com/questions/269014