Mysql数据类型之字符串的案例介绍(含latin1下varchar的最大长度是65532还是65533)
認識Mysql數(shù)據(jù)類型里的字符串
數(shù)據(jù)類型概述
Mysql里的數(shù)據(jù)類型主要有數(shù)值型(整形、浮點型)、時間類型、字符串類型、JSON類型、坐標類型、混合類型(整數(shù)或字符串)。本文主要介紹字符串和二進制類型的使用。
字符串與二進制類型概述
字符串是和二進制類型是比較靈活的可以存放任意數(shù)據(jù)的靈活類型。二進制類型和字符串的差別是字符串在存儲時指定了字符集,即mysql能“讀懂”這個字符串,而二級制則存的是裸的數(shù)據(jù),需要特定或者專有的方法(程序)去解析。
行容量限制
因為mysql里每一個行的大小被限制在64k,所以varchar、varbinary最大只能存65533 個字符。其中如果該字段定義為NOT NULL為65533、NULL 為65532,這是因為定義為VARCHAR類型需要占2個字節(jié),定義為NULL時存儲標記位占1個字節(jié),總存儲為65535,所以有65532這個結(jié)果。
更多信息可參考: https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#row-size-limits
字符集
utf8mb4是未來支持的默認字符集(即一個字符占4個字節(jié)),當前版本(Mysql.8)的字符集是utf8mb3(一個字符占3個字節(jié)),盡管它是utf8的別名。
排序規(guī)則
排序規(guī)則經(jīng)常用在字段排序和比較中,以utf8mb4_0900_ai_ci,來介紹其含義:
utf8mb4:所屬的字符集
0900:該排序規(guī)則基于Unicode Collation Algorithm (UCA) 9.0.0。
ai: 排序規(guī)則可以是重音不敏感(ai)或重音敏感(as)。
ci: A collation can be case insensitive (ci) or case sensitive (cs)
數(shù)據(jù)類型與最大長度
| 數(shù)據(jù)類型 | 最大字節(jié)長度 |
| char(M) | 255字符 |
| varchar(M) | utf8mb4下16383個字符、latin1下65532或65533個字符 |
| tinytext | 255個字節(jié) |
| text | 65535個字節(jié) |
| mediumtext | 16777216個字節(jié) |
| longtext | 4294967296個字節(jié) |
| binary(M) | 255個字節(jié) |
| varbinary(M) | 65532個字節(jié) |
代碼示例
-- 1 char類型最大為255個字符。 CREATE TABLE tb_chartype (charcol char(256)) > 1074 - Column length too big for column 'charcol' (max = 255); use BLOB or TEXT instead > 時間: 0s -- 2 超過255則報錯。 INSERT INTO tb_chartype select REPEAT('m', 256) > 1406 - Data too long for column 'charcol' at row 1 > 時間: 0.004sINSERT INTO tb_chartype select REPEAT('m', 255);INSERT INTO tb_chartype select REPEAT('中', 255);# 3 設置varchar的最大長度 ALTER TABLE tb_chartype ADD varcharcol VARCHAR(65532) > 1074 - Column length too big for column 'varcharcol' (max = 21844); use BLOB or TEXT instead > 時間: 0.518s這里報錯是因為當前表的字符集是utf8mb3即一個字符占3個字節(jié),所以當前字符集下varchar最大存的是21844個字符。即65532/3=21844。CREATE TABLE `tb_chartype` (`charcol` char(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;-- 4 因為一個表定義時所有字段的總長度不超過65535字節(jié)(64k),所以這里報錯。 ALTER TABLE tb_chartype ADD varcharcol VARCHAR(21844) > 1118 - Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs > 時間: 0.448sALTER TABLE tb_chartype ADD varcharcol VARCHAR(21589) > OK > 時間: 0.62s--這里21844-255=21589-- 5 插入21590個則會報錯,因為最大長度是21589 INSERT INTO tb_chartype(varcharcol) select REPEAT('國', 21590);INSERT INTO tb_chartype(varcharcol) select REPEAT('國', 21589) > Affected rows: 1 > 時間: 0.101s-- 6 如果指定表的字符集是latin1,則最大長度是65532。 CREATE TABLE tb_charvar2( varcol varchar(65532) ) DEFAULT CHARSET=latin1 INSERT INTO tb_charvar2 SELECT REPEAT('A',65532)-- 7 varchar類型單字段最大長度。NOT NULL為65533、NULL 為65532。Mariadb里統(tǒng)一為65532。 CREATE TABLE `a` (`c1` varchar(65533) not null ) ENGINE=InnoDB DEFAULT CHARSET=latin1CREATE TABLE `b` (`c1` varchar(65532) null ) ENGINE=InnoDB DEFAULT CHARSET=latin1總結(jié)
以上是生活随笔為你收集整理的Mysql数据类型之字符串的案例介绍(含latin1下varchar的最大长度是65532还是65533)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mysql数据类型之浮点与二进制型数据使
- 下一篇: linux cmake编译源码,linu