2017-08-15 181 views
0

關於stackoverflow的通用建議是在MySQL中無處不在的地方使用utf8或utf8mb4,即使對於只包含拉丁字符的字段也是如此。在MySQL中使用拉丁字符集存儲電子郵件和域名

爲了澄清,僅含拉丁字符一列,將使用utf8mb4:

  1. ...導致較大的指數和更高的內存使用情況?
  2. ...使用列類型varchar(100)或char(100)時使用更多的存儲空間?
  3. ...允許多於100個字符存儲在列類型varchar(100)或char(100)中?

回答

2

這是2017年使用utf8mb4VARCHAR(255)每一個普通的「字符串」字段,除非你有一個非常令人信服的理由從偏離。甚至純英語演講者也喜歡在「¯\ _(ツ)_ /¯」和「ᕕ(ᐛ)ᕗ」等情況下使用古怪的非拉丁字符。

電子郵件地址可以在域組件中以及@之前的本地部分中包含非ASCII字符。無論規則如何,這些事情似乎都會逐漸被拋出窗外,所以所有的賭注都是爲了未來的。希望@保持,這是我唯一依靠的東西。

除非您有一個系統在內存中處理數十億個電子郵件地址,否則VARCHAR的存儲成本在很大程度上是無關緊要的。請記住,VARCHAR(100)VARCHAR(255)對於50個字符的字符串需要完全相同的空間量。當他們的電子郵件地址「太長」並且被任意修剪時,這個100長的字段所做的唯一工作就是讓別人感到緊張。

此外,VARCHAR措施字符長度和不字節,差值當多字節字符參與即唯一相關。 [email protected]在Latin-1,UTF-8和UTF8MB4中佔用相同的空間量。

請勿將CHAR用於可變長度字符字段。 20世紀80年代已經死亡。隨它吧。

+0

當你說電子郵件地址可以包含非ASCII,我相信那些需要在驗證之前進行punyencoded,最終使他們成爲ASCII。儘管我同意存儲成本在很大程度上不相關,但考慮到在虛擬機中運行db的少量ram可用,索引/內存成本仍然相關。 – nwarp

+0

定義「小」?即使是現在最薄弱的VPS設備也帶有512MB的內存,而且我沒有任何麻煩地運行了很多東西。這主要是調整數據庫服務器以使用適當的內存量,而不是過分積極地進行交換。在與電子郵件地址相關的內存和存儲方案中,您的擔憂是最少的。您更關心的問題將是如何管理應用程序代碼的日誌,指標和內存佔用情況。 – tadman

+0

通常情況下,您最好將電子郵件地址存儲起來,並讓電子郵件傳送過程找出如何發送。自己做編碼並不重要,Punycoding只是解決方案的一半,本地部分使用完全不同的編碼方法。如果你關心內存,Punycoding的方向是錯誤的,它比等效的UTF-8表示要大得多。 – tadman

相關問題