mysql中数据类型的长度
一、varchar(n)、char(n)中的n的含義
1)varchar(m),char(n)里面的m或n代表的是字符的個數。
打開mysql手冊,看到這樣一句話 The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters.
注意加粗的單詞,手冊中明確指出,存放的是字符的個數。
例如:varchar(30)中30的涵義:最大存儲30個字符;varchar(5)和(200)存儲hello所占空間一樣,但后者在排序時會消耗更多內存,因為order by col采用fixed_length計算col長度。
2):varchar(m),char(n)里面的m和n是否有長度限制?分別是多少?
首先我們明確一下,m和n是一定會有長度限制的。那么究竟是多少呢?這個問題需要我們詳細看一下各個知識點。
第一:討論char(n)
The length of a CHAR column is fixed to the length that you declare when you create the table. The length can be any value from 0 to 255. When CHAR values are stored, they are right-padded with spaces to the specified length.When CHAR values are retrieved, trailing spaces are removed unless the PAD_CHAR_TO_FULL_LENGTH [581]SQL mode is enabled.
手冊中指出,長度的限制是0-255,經過驗證,長度的限制是0-255個字符。也就是說,沒有明確標出字節的限制數。
第二:討論varchar(m)
Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 65,535.The effective maximum length of a VARCHARis subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. See Section E.10.4, “Table Column-Count and Row-Size Limits”.
In contrast to CHAR, VARCHAR values are stored as a 1-byte or 2-byte lengthprefix plus data. The length prefix indicates the number of bytes in the value. A column uses one length byte if values require no more than 255 bytes,two length bytes if values may require more than 255 bytes.
注意上面兩段話中的加粗部分。
首先我們明確,m也是字符的個數。而上面句子中提到的65535是指varchar列最大可存放的字節數。
我們知道,在gbk編碼格式下,字節數=字符數*2 ;在utf8編碼格式下,字節數=字符數*3 【*中文情況下】
但是,在varchar中,因為是變長,所以需要1-2個字節來標識這一列的長度。如果varchar字段定義中帶有default null允許列空,則需要需要1bit來標識,每8個bits的標識組成一個字段。一張表中存在N個varchar字段,那么需要(N+7)/8 (取整)bytes存儲所有的NULL標識位。
我們假設一張表只有varchar一列,且此時該字段設置為DEFAULT NULL,那么該varchar字段的最大長度為65535-2-(1+7)/8 = 65532bytes.
這時候新的疑問出現了。為什么要假設表只有一列數據,這是很不符合常規的。原因在上面描紫的語句。
什么意思?
我們要知道,每一行數據的總長度是有限制的,每一行最大字節數就是65535個。我們創建一張表時,需要把每個字段需要占用的字節進行統計,總數不能超過65535即可。其中text和blob根據存放的數據量不同可能占用1,2,3,4個字節。在計算的時候要按4字節進行計算。
*3)、int(20)中20的涵義
20表示最大顯示寬度為20,但仍占4字節存儲,存儲范圍不變;
二、mysql中數據類型的長度
(1)字符類型
| TINYINT | 1 字節 | (-128,127) | (0,255) | 小整數值 |
| SMALLINT | 2 字節 | (-32 768,32 767) | (0,65 535) | 大整數值 |
| MEDIUMINT | 3 字節 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整數值 |
| INT或INTEGER | 4 字節 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整數值 |
| BIGINT | 8 字節 | (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 極大整數值 |
| FLOAT | 4 字節 | (-3.402 823 466 E+38,1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度 浮點數值 |
| DOUBLE | 8 字節 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度 浮點數值 |
| DECIMAL | 對DECIMAL(M,D) ,如果M>D,為M+2否則為D+2 | 依賴于M和D的值 | 依賴于M和D的值 | 小數值 |
2)字符類型
| VARCHAR | 參見上面的討論 | 變長字符串 |
| TINYTEXT | 0-255字節 | 短文本字符串 |
| TEXT | 0-65 535字節 | 長文本數據 |
| MEDIUMTEXT | 0-16 777 215字節 | 中等長度文本數據 |
| LONGTEXT | 0-4 294 967 295字節 | 極大文本數據 |
3)枚舉集合類型
ENUM (最多65535個成員) 64KB
SET (最多64個成員) 64KB
4)二進制數據類型
| BLOB | 0-65 535字節 | 二進制形式的長文本數據,最大64k |
| MEDIUMBLOB | 0-16 777 215字節 | 二進制形式的中等長度文本數據,最大16M |
| LOGNGBLOB | 0-4 294 967 295字節 | 二進制形式的極大文本數據,最大4GB |
5)時間類型
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | ‘-838:59:59’/‘838:59:59’ | HH:MM:SS | 時間值或持續時間 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
| TIMESTAMP | 8 | 1970-01-01 00:00:00/2037 年某時 | YYYYMMDD HHMMSS | 混合日期和時間值,時間戳 |
總結
以上是生活随笔為你收集整理的mysql中数据类型的长度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot配置dubbo(p
- 下一篇: 编译器原理笔录(2)-符号表示法的形式化