2010-03-30 172 views
1

只是爲了澄清,通過指定類似VARCHAR(45)的字符表示最多可能需要45個字符?我記得幾年前我從別人那裏聽說,括號中的數字並不是指字符的號碼,那麼這個人試圖向我解釋一些我不明白和已經忘記的複雜的東西。數據庫數據類型大小

CHAR和VARCHAR有什麼區別?我搜索了一下,看到CHAR給出了列大小的最大值,如果數據具有固定的大小,最好使用它,如果數據大小不同,則使用VARCHAR。

但是,如果它給你這個列的所有數據列的大小的最大值,當你的數據大小變化時使用它不是更好嗎?特別是如果你不知道你的數據量有多大。 VARCHAR需要指定大小(CHAR真的不需要對嗎?),這不是更麻煩嗎?

+0

相關問題: - http://stackoverflow.com/questions/758699/is-the-char-datatype-in​​-sql-obsolete-when-do-you-use-it – 2010-03-30 03:38:19

回答

1

您還必須使用CHAR指定尺寸。使用CHAR時,列值將填充空格以填充您指定的大小,而使用VARCHAR時,只會存儲指定的實際值。

例如:

CREATE TABLE test (
    char_value CHAR(10), 
    varchar_value VARCHAR(10) 
); 

INSERT INTO test VALUES ('a', 'b'); 

SELECT * FROM test; 

以上將選擇 「A          」 爲char_value和 「B」 爲varchar_value

如果所有的值都差不多大小,CHAR可能是更好的選擇,因爲它往往需要比VARCHAR更少的存儲空間。這是因爲VARCHAR存儲了值的長度和值本身,而CHAR只能存儲(固定大小)值。

+1

它是怎麼回事?比如說,我在varchar(255)中存儲1個字節。所以,我有2個字節作爲總長度。而字符將佔用255個字節 – 2010-03-30 07:26:38

+1

是的,但是說在這種情況下你有varchar(2)與char(2),char(2)將是兩個字節,varchar(2)將是3個字節。 – 2010-03-30 08:26:45

+0

我喜歡這個清晰的例子,謝謝! – yeeen 2010-03-30 16:24:17

1

MySQL documentation很好地解釋了各種數據類型的存儲需求。

特別是,對於長度爲L的字符串,CHAR(M)數據類型將佔用(M xc)個字節(其中c是存儲字符所需的字節數......這取決於正在使用的字符集) 。 根據M是否爲< = 255或> 255,A VARCHAR(M)將佔用(L + 1)或(L + 2)。

所以,這實際上取決於你期望你的字符串有多長,長度的變化是多少。

注意:文檔沒有討論字符集對VARCHAR類型的存儲要求的影響。我試圖準確地引用它,但我的猜測是,您需要將字符串長度乘以字符字節寬度以獲得存儲要求。

+0

我認爲它說不需要繁殖,只需添加? – yeeen 2010-03-30 16:34:11

+0

我不確定你指的是...你能直接從文檔中引用嗎? – Dancrumb 2010-03-31 00:55:50

0

如果您知道一列中將包含一個小的,固定數量的字符使用CHAR,否則使用varchar。 CHAR列被填充到最大長度。

VARCHAR有一個小開銷(取決於RDBMS的4-8字節),但只使用開銷+存儲的實際字符數。

0

對於您知道的值,它們將保持不變,例如電話號碼,郵政編碼等,確保使用「char」是最佳選擇。

0

你不記得的複雜的東西是45指的是字節,而不是字符。如果您使用多字節字符編碼,則不一樣。在Oracle中,您可以明確指定字節或字符。

varchar2(45 BYTE) 

varchar2(45 CHAR) 

Difference between BYTE and CHAR in column datatypes

+0

是的,它是abt字節。但是這個對話中的數字已經被驗證爲MySQL中的字符:) – yeeen 2010-03-30 16:35:33

+0

在Oracle,IIRC中並非如此。 – Samuel 2010-03-31 06:48:29

1

CHAR和VARCHAR竟變得無關緊要,如果你只有1可變長度字段在表中,像一個varchar或文本。 Mysql會自動將所有字符更改爲varchar。

固定長度/大小記錄可以爲您提供額外的性能,但不能使用任何可變長度字段類型。原因是,它會更快,更容易找到下一個記錄的MySQL。

例如,如果您執行SELECT * FROM表LIMIT 10,則mysql必須掃描表文件中的第十條記錄。這意味着要找到每個記錄的結尾,直到找到第10條記錄的結尾。但是如果你的表有固定長度/大小的記錄,mysql只需要知道記錄大小,然後跳過10 x#字節。