VARCHAR(255) - 或不
建議最大 len
首先,我將提到一些常見的字串,這些字串總是十六進位制,或者限制為 ASCII。對於這些,你應該指定 CHARACTER SET ascii
(latin1
沒問題),這樣就不會浪費空間:
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
需要建立臨時表(對於子查詢,UNION
,GROUP BY
等)時,首選的選擇是使用MEMORY
引擎,它將資料放入 RAM 中。但是VARCHARs
在這個過程中變成了CHAR
。這使得VARCHAR(255) CHARACTER SET utf8mb4
佔用 1020 個位元組。這可能導致需要溢位到磁碟,這是較慢的。 - 在某些情況下,InnoDB 將檢視錶中列的可能大小,並確定它將太大,中止了一個
CREATE TABLE
。
VARCHAR 與 TEXT
*TEXT
,CHAR
和 VARCHAR
的使用提示,以及一些最佳實踐:
- 永遠不要使用
TINYTEXT
。 - 幾乎從不使用
CHAR
- 它是固定長度; 每個字元是CHARACTER SET
的最大長度(例如,utf8mb4 的 4 個位元組/字元)。 - 使用
CHAR
,除非另有說明,否則請使用CHARACTER SET ascii
。 VARCHAR(n)
將截斷 n 個字元 ;TEXT
將截斷一些位元組數。 (但是,你想截斷嗎?)- 由於如何處理臨時表,
*TEXT
可能會減慢複雜的SELECTs
。