2009-08-11 170 views
23

可能重複:
Are there disadvantages to using a generic varchar(255) for all text-based fields?MySQL:爲什麼使用VARCHAR(20)而不是VARCHAR(255)?

在MySQL中,你可以選擇爲VARCHAR字段類型的長度。可能的值是1-255。

但是,如果使用最大值而不是VARCHAR(20)的VARCHAR(255),它的優點是什麼?據我所知,條目的大小僅取決於插入字符串的實際長度。

大小(字節)=長度+ 1

因此,如果你在一個VARCHAR(255)字段具有單詞 「實施例」,這將有8個字節。如果你在VARCHAR(20)字段中有它,它也會有8個字節。有什麼不同?

我希望你能幫助我。提前致謝!

回答

24

退房:Reference for Varchar

總之沒有太大的區別,除非你去的255在您的VARCHAR規模,這將需要長度前綴另一個字節。

長度表示存儲在列中的數據的一個約束比其他任何更多。這固有地限制了列的MAXIMUM存儲大小。恕我直言,長度應該對數據有意義。如果您存儲社會安全#,將長度設置爲128是沒有意義的,即使您實際存儲的所有內容都是SSN,也不會在存儲中花費任何費用。

1

那麼,如果你想允許一個更大的條目,或限制條目大小也許。

例如,您可能將first_name作爲VARCHAR 20,但可能將street_address作爲VARCHAR 50,因爲20可能沒有足夠的空間。同時,你可能想要控制這個價值可以得到多大。

換句話說,您已經設定了一個特定值可以有多大的上限,理論上是爲了防止表(以及潛在的索引/索引條目)變得過大。

你可以只使用CHAR這是一個固定的寬度爲好,但不像VARCHAR它可以更小,CHAR墊的值(儘管這使得更快SQL訪問。

+0

但爲什麼我應該將長度設置爲20?如果沒有區別,我可以簡單地將它設置爲255,適用於所有領域,不是嗎? – caw 2009-08-11 18:42:39

+0

看到我的編輯 - 我詳細闡述一點。 – OneNerd 2009-08-11 18:45:16

+0

謝謝。所以它不會在存儲和性能方面產生任何差異,對吧?但是,它可能是有用的,但是,例如,如果你想剪切字符串以防止長的字符串。但是如果你在PHP中使用substr()或者在另一種語言中使用類似的函數,你也可以實現這一點!? – caw 2009-08-11 18:55:01

1

從數據庫的角度來看性能方面我做的不相信會有區別

但是,我認爲很多關於使用長度的決定歸結爲您正在努力完成的任務,並將系統記錄爲僅接受它所需的數據。

+1

「請注意,如果整個記錄的大小是固定的,那麼使用CHAR只會加快您的訪問速度,也就是說,如果您使用任何可變大小的對象,則可能使它們全部變爲可變大小。在一個也包含VARCHAR的表中。「 [鏈接](http://dev.mysql.com/doc/refman/5.0/en/char.html) – 2013-10-27 08:24:17

16

選擇一個小於ar的最大值的值有很多有效的理由與表現無關。設置大小有助於指示您正在存儲的數據類型,並且還可以充當最後一種驗證形式。

例如,如果您要存儲英國郵政編碼,那麼您只需要8個字符。設置此限制有助於明確您要存儲的數據類型。如果你選擇了255個字符,它只會混淆事項。

+1

+1用於強調清晰度和可理解性。當然,我會質疑使用buf [1024],一個「新的DynamicBuf(1024)」或者一個VARCHAR(255)來存儲例如一個單獨的虛線四個IP地址。編碼員知道他在做什麼? – pilcrow 2009-08-11 19:14:27

+4

+1如果您決定使用VARCHAR(8)作爲英國郵政編碼,請使用CHAR(8)表示:) – 2009-08-11 19:39:28

+1

如果要存儲8個字符的郵編,則應該使用CHAR(8)。最好避免在表中存在VARCHAR列,因爲它會強制varibale行長度並在表中尋找較慢的值。但是,如果你不能擁有固定長度的所有列,則不重要。 – 2013-09-09 09:42:17

1

存在語義上的差異(我相信這是唯一的區別):如果你試圖將30個非空格字符填充到varchar(20)中,它將產生一個錯誤,而varchar(255) 。所以它主要是一個額外的限制。

+0

但是不是很清楚,30個字符不適合20字節的字段? – caw 2009-08-11 18:58:03

+2

正如你所說,存儲表示並不關心這個長度:一個聲明爲varchar(20)的字段可以很好地存儲30個字符,就磁盤表示而言 - 我認爲這個觀察結果是你問題的核心(爲什麼並不總是使用varchar(255)?)現在,我告訴你爲什麼設置varchar(20)的原因:因爲如果你不小心嘗試輸入超過20個字符,你就會想要得到的錯誤。 – 2009-08-11 19:06:55

+0

所以它只是用於驗證問題,對嗎? – caw 2009-08-11 19:55:23

5

我不知道mySQL,但在SQL Server中它可以讓你定義字段,使得使用的字節總數大於實際存儲在記錄中的總字節數。這是一件壞事。遲早你會得到一個限制已達到的行,並且你不能插入數據。

設計數據庫結構以考慮行大小限制要好得多。

此外是的,你不希望人們在最大值應該是10的字段中放置200個字符。如果他們這樣做,那幾乎總是不好的數據。

你說,我可以限制在應用程序級別。但是數據不會從一個應用程序進入數據庫。有時多個應用程序使用它,有時數據被導入,有時從查詢窗口手動修復(例如更新所有記錄以將價格增加10%)。如果這些其他數據源中的任何一個不知道您在應用程序中放置的規則,那麼您的數據庫中將會有糟糕的無用數據。數據完整性必須在數據庫級別執行(這不會阻止您在嘗試輸入數據之前進行檢查),或者您沒有完整性。另外,根據我的經驗,那些懶得設計數據庫的人通常也懶得實際地將限制放在應用程序中,並且根本沒有數據完整性檢查。

他們對沒有數據完整性的數據庫有一個詞 - 沒用。

相關問題