Mysql数据类型之字符串的案例介绍(含latin1下varchar的最大长度是65532还是65533)
認(rèn)識Mysql數(shù)據(jù)類型里的字符串
數(shù)據(jù)類型概述
Mysql里的數(shù)據(jù)類型主要有數(shù)值型(整形、浮點(diǎn)型)、時(shí)間類型、字符串類型、JSON類型、坐標(biāo)類型、混合類型(整數(shù)或字符串)。本文主要介紹字符串和二進(jìn)制類型的使用。
字符串與二進(jìn)制類型概述
字符串是和二進(jìn)制類型是比較靈活的可以存放任意數(shù)據(jù)的靈活類型。二進(jìn)制類型和字符串的差別是字符串在存儲時(shí)指定了字符集,即mysql能“讀懂”這個(gè)字符串,而二級制則存的是裸的數(shù)據(jù),需要特定或者專有的方法(程序)去解析。
行容量限制
因?yàn)閙ysql里每一個(gè)行的大小被限制在64k,所以varchar、varbinary最大只能存65533 個(gè)字符。其中如果該字段定義為NOT NULL為65533、NULL 為65532,這是因?yàn)槎x為VARCHAR類型需要占2個(gè)字節(jié),定義為NULL時(shí)存儲標(biāo)記位占1個(gè)字節(jié),總存儲為65535,所以有65532這個(gè)結(jié)果。
更多信息可參考: https://dev.mysql.com/doc/refman/8.0/en/column-count-limit.html#row-size-limits
字符集
utf8mb4是未來支持的默認(rèn)字符集(即一個(gè)字符占4個(gè)字節(jié)),當(dāng)前版本(Mysql.8)的字符集是utf8mb3(一個(gè)字符占3個(gè)字節(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個(gè)字符、latin1下65532或65533個(gè)字符 |
| tinytext | 255個(gè)字節(jié) |
| text | 65535個(gè)字節(jié) |
| mediumtext | 16777216個(gè)字節(jié) |
| longtext | 4294967296個(gè)字節(jié) |
| binary(M) | 255個(gè)字節(jié) |
| varbinary(M) | 65532個(gè)字節(jié) |
代碼示例
-- 1 char類型最大為255個(gè)字符。 CREATE TABLE tb_chartype (charcol char(256)) > 1074 - Column length too big for column 'charcol' (max = 255); use BLOB or TEXT instead > 時(shí)間: 0s -- 2 超過255則報(bào)錯(cuò)。 INSERT INTO tb_chartype select REPEAT('m', 256) > 1406 - Data too long for column 'charcol' at row 1 > 時(shí)間: 0.004sINSERT INTO tb_chartype select REPEAT('m', 255);INSERT INTO tb_chartype select REPEAT('中', 255);# 3 設(shè)置varchar的最大長度 ALTER TABLE tb_chartype ADD varcharcol VARCHAR(65532) > 1074 - Column length too big for column 'varcharcol' (max = 21844); use BLOB or TEXT instead > 時(shí)間: 0.518s這里報(bào)錯(cuò)是因?yàn)楫?dāng)前表的字符集是utf8mb3即一個(gè)字符占3個(gè)字節(jié),所以當(dāng)前字符集下varchar最大存的是21844個(gè)字符。即65532/3=21844。CREATE TABLE `tb_chartype` (`charcol` char(255) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;-- 4 因?yàn)橐粋€(gè)表定義時(shí)所有字段的總長度不超過65535字節(jié)(64k),所以這里報(bào)錯(cuò)。 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 > 時(shí)間: 0.448sALTER TABLE tb_chartype ADD varcharcol VARCHAR(21589) > OK > 時(shí)間: 0.62s--這里21844-255=21589-- 5 插入21590個(gè)則會報(bào)錯(cuò),因?yàn)樽畲箝L度是21589 INSERT INTO tb_chartype(varcharcol) select REPEAT('國', 21590);INSERT INTO tb_chartype(varcharcol) select REPEAT('國', 21589) > Affected rows: 1 > 時(shí)間: 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数据类型之浮点与二进制型数据使
- 下一篇: 99A型主战坦克凭什么称为“陆战之王