亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Mysql中varchar類型一些需要注意的地方

瀏覽:3日期:2023-10-06 17:56:25
varchar的存儲規(guī)則

4.0版本以下,varchar(20),指的是20字節(jié),如果存放UTF8漢字時(shí),只能存6個(gè)(每個(gè)漢字3字節(jié))。5.0版本以上,varchar(20),指的是20字符,無論存放的是數(shù)字、字母還是UTF8漢字(每個(gè)漢字3字節(jié)),都可以存放20個(gè),最大大小是65532字節(jié)。varchar 字段是將實(shí)際內(nèi)容單獨(dú)存儲在聚簇索引之外,內(nèi)容開頭用1到2個(gè)字節(jié)表示實(shí)際長度。官方是這么說的:

Values in VARCHAR columns are variable-length strings. The length can be specified as a value from 0 to 255 before MySQL 5.0.3, and 0 to 65,535 in 5.0.3 and later versions.In contrast to CHAR, VARCHAR values are stored as a one-byte or two-byte length prefix 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.

varchar和char 的區(qū)別區(qū)別一,定長和變長

char 表示定長,長度固定,varchar表示變長,即長度可變。當(dāng)所插入的字符串超出它們的長度時(shí),視情況來處理,如果是嚴(yán)格模式,則會拒絕插入并提示錯(cuò)誤信息,如果是寬松模式,則會截取然后插入。如果插入的字符串長度小于定義長度時(shí),則會以不同的方式來處理,如char(10),表示存儲的是10個(gè)字符,無論你插入的是多少,都是10個(gè),如果少于10個(gè),則用空格填滿。而varchar(10),小于10個(gè)的話,則插入多少個(gè)字符就存多少個(gè)。varchar怎么知道所存儲字符串的長度呢?實(shí)際上,對于varchar字段來說,需要使用一個(gè)(如果字符串長度小于255)或兩個(gè)字節(jié)(長度大于255)來存儲字符串的長度。但是因?yàn)樗枰幸粋€(gè)prefix來表示他具體bytes數(shù)是多少(因?yàn)関archar是變長的,沒有這個(gè)長度值他不知道如何讀取數(shù)據(jù))。

區(qū)別之二,存儲的容量不同

對 char 來說,最多能存放的字符個(gè)數(shù) 255,和編碼無關(guān)。而 varchar 呢,最多能存放 65532 個(gè)字符。VARCHAR 的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是 65,532字節(jié)

varchar的編碼長度限制

字符類型若為 gbk,則個(gè)字符最多占2個(gè)字節(jié),最大長度不能超過32766; 字符類型若為utf8,則每個(gè)字符最多占3個(gè)字節(jié),最大長度不能超過21845。 若定義的時(shí)候超過上述限制,則varchar字段會被強(qiáng)行轉(zhuǎn)為text類型,并產(chǎn)生warning。

行長度限制

導(dǎo)致實(shí)際應(yīng)用中varchar長度限制的是一個(gè)行定義的長度。 MySQL要求一個(gè)行的定義長度不能超過65535。若定義的表長度超過這個(gè)值,則提示 ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。這就是說,比如創(chuàng)建一個(gè)表,表結(jié)構(gòu)中有兩個(gè)varhcar類型字段,那么這兩個(gè)字段的總長度不能超過65535。官方說明如下:

Every table has a maximum row size of 65,535 bytes.This maximum applies to all storage engines, but a given engine might have additional constraints that result in a lower effective maximum row size.

varchar的控制位

MySQL 中的Varchar字符類型還保留了1個(gè)字節(jié)來留其它控制信息。

示例示例一:若一張表中只有一個(gè)字段VARCHAR(N)類型,utf8編碼,則N最大值為多少?

如:create table tb_name1(a varchar(N)) default charset=utf8,則N最大值=(65535-1-2)/3=21844。減1的原因是實(shí)際行存儲從第二個(gè)字節(jié)開始。減2的原因是varchar頭部的2個(gè)字節(jié)表示長度。除3的原因是字符編碼是utf8。sql測試:

create table tb_name1(a varchar(21844)) default charset=utf8;Query OK, 0 rows affected (0.38 sec)drop table tb_name1;Query OK, 0 rows affected (0.00 sec)create table tb_name1(a varchar(21845)) default charset=utf8;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns 示例二:若一張表中有一個(gè)字段VARCHAR(N)類型,并且有其它的字段類型,utf8編碼,則N的最大值為多少?

如:create table tb_name2(a int, b char(20), c varchar(N)) default charset=utf8;則:N最大值=(65535-1-2-4-203)/3=21822減1的原因是實(shí)際行存儲從第二個(gè)字節(jié)開始。減2的原因是varchar頭部的2個(gè)字節(jié)表示長度。減4的原因是a字段的int類型占4個(gè)字節(jié)。減203的原因是char(20)占用60個(gè)字節(jié),編碼是utf8。

sql測試:

create table tb_name2(a int, b char(20), c varchar(21822)) default charset=utf8;Query OK, 0 rows affected (0.28 sec)drop table tb_name2;Query OK, 0 rows affected (0.20 sec)create table tb_name2(a int, b char(20), c varchar(21823)) default charset=utf8;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs示例三:若一張表中有多字段VARCHAR(N)類型,并且有其它的字段類型,gbk編碼,則N的最大值為多少?

如:create table tb_name3(a int, b char(20), c varchar(50), d varchar(N)) default charset=gbk;則:N最大值=(65535-1-1-2-4-202-502)/2=32693第一個(gè)減1的原因是實(shí)際行存儲從第二個(gè)字節(jié)開始。第二個(gè)減1表示第二個(gè)varchar(50)頭部一個(gè)1個(gè)字節(jié)表示長度(小于255)。減2的原因是varchar頭部的2個(gè)字節(jié)表示長度。減202的原因是char(20)占用40個(gè)字節(jié),編碼是gbk。減502的原因是varchar(50)占用100個(gè)字節(jié),編碼是gbk。

SQL測試:

create table tb_name3(a int, b char(20), c varchar(50), d varchar(32694)) default charset=gbk;ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs

create table tb_name3(a int, b char(20), c varchar(50), d varchar(32693)) default charset=gbk;Query OK, 0 rows affected (0.18 sec)

以上就是Mysql中varchar類型一些需要注意的地方的詳細(xì)內(nèi)容,更多關(guān)于Mysql varchar類型的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: MySQL 數(shù)據(jù)庫
相關(guān)文章:
主站蜘蛛池模板: 亚洲色图综合 | 一区二区视频免费观看 | 亚洲一逼 | 精品五夜婷香蕉国产线看观看 | 亚洲国产日韩在线观频 | 日韩高清在线免费观看 | 能看毛片的网址 | wwwxxx亚洲| 国产成人亚洲综合 | 色综合久久天天综合绕观看 | 亚洲国产第一区二区香蕉 | 日本一二三精品黑人区 | 最新国产精品精品视频 | 调教~奴●メイドの馆 | 成人午夜电影免费完整在线看 | 国产麻豆高清视频在线第一页 | 在线观看片 | 你懂得国产| 国产一区二区三区视频在线观看 | 国产视频一二区 | 农村寡妇一级毛片免费看视频 | 国产美女在线观看 | 国产视频不卡在线 | 国产精品视频一区二区三区w | 特黄a大片免费视频 | 黄色一级片在线播放 | 黄色免费高清视频 | 国产精品亚洲片在线不卡 | 自拍欧美日韩 | 色播日韩| 国产精品久久久久久五月尺 | 日韩在线综合 | 在线看片y | 欧美一级成人 | 国产乱人视频在线看 | 亚洲精品第一综合99久久 | 亚洲国产精品一区二区三区在线观看 | 国产好大好爽久久久久久久 | 国产午夜亚洲精品一级在线 | 天堂亚洲欧美日韩一区二区 | 日韩免费在线播放 |