VARCHAR(255) - 或不

建議最大 len

首先,我將提到一些常見的字串,這些字串總是十六進位制,或者限制為 ASCII。對於這些,你應該指定 CHARACTER SET asciilatin1 沒問題),這樣就不會浪費空間:

UUID CHAR(36) CHARACTER SET ascii -- or pack into BINARY(16)
country_code CHAR(2) CHARACTER SET ascii
ip_address CHAR(39) CHARACTER SET ascii -- or pack into BINARY(16)
phone VARCHAR(20) CHARACTER SET ascii -- probably enough to handle extension
postal_code VARCHAR(20) CHARACTER SET ascii -- (not 'zip_code') (don't know the max

city VARCHAR(100) -- This Russian town needs 91:
    Poselok Uchebnogo Khozyaystva Srednego Professionalno-Tekhnicheskoye Uchilishche Nomer Odin
country VARCHAR(50) -- probably enough
name VARCHAR(64) -- probably adequate; more than some government agencies allow

**為什麼不簡單 255?**有兩個原因可以避免對所有事物使用(255)的常見做法。

  • 當一個複雜的 SELECT 需要建立臨時表(對於子查詢,UNIONGROUP BY 等)時,首選的選擇是使用 MEMORY 引擎,它將資料放入 RAM 中。但是 VARCHARs 在這個過程中變成了 CHAR。這使得 VARCHAR(255) CHARACTER SET utf8mb4 佔用 1020 個位元組。這可能導致需要溢位到磁碟,這是較慢的。
  • 在某些情況下,InnoDB 將檢視錶中列的可能大小,並確定它將太大,中止了一個 CREATE TABLE

VARCHARTEXT

*TEXTCHARVARCHAR 的使用提示,以及一些最佳實踐:

  • 永遠不要使用 TINYTEXT
  • 幾乎從不使用 CHAR - 它是固定長度; 每個字元是 CHARACTER SET 的最大長度(例如,utf8mb4 的 4 個位元組/字元)。
  • 使用 CHAR,除非另有說明,否則請使用 CHARACTER SET ascii
  • VARCHAR(n) 將截斷 n 個字元 ; TEXT 將截斷一些位元組數。 (但是,你想截斷嗎?)
  • 由於如何處理臨時表,*TEXT 可能會減慢複雜的 SELECTs