最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2021年01月12日 15:27:49   作者:經典雞翅  
這篇文章主要介紹了Mysql中varchar類型一些需要注意的地方,幫助大家更好的理解和學習MySQL,感興趣的朋友可以了解下

varchar的存儲規(guī)則

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

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表示變長,即長度可變。當所插入的字符串超出它們的長度時,視情況來處理,如果是嚴格模式,則會拒絕插入并提示錯誤信息,如果是寬松模式,則會截取然后插入。如果插入的字符串長度小于定義長度時,則會以不同的方式來處理,如char(10),表示存儲的是10個字符,無論你插入的是多少,都是10個,如果少于10個,則用空格填滿。而varchar(10),小于10個的話,則插入多少個字符就存多少個。
varchar怎么知道所存儲字符串的長度呢?實際上,對于varchar字段來說,需要使用一個(如果字符串長度小于255)或兩個字節(jié)(長度大于255)來存儲字符串的長度。但是因為他需要有一個prefix來表示他具體bytes數是多少(因為varchar是變長的,沒有這個長度值他不知道如何讀取數據)。

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

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

varchar的編碼長度限制

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

行長度限制

導致實際應用中varchar長度限制的是一個行定義的長度。 MySQL要求一個行的定義長度不能超過65535。若定義的表長度超過這個值,則提示 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)建一個表,表結構中有兩個varhcar類型字段,那么這兩個字段的總長度不能超過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個字節(jié)來留其它控制信息。

示例

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

如:create table tb_name1(a varchar(N)) default charset=utf8,則N最大值=(65535-1-2)/3=21844。
減1的原因是實際行存儲從第二個字節(jié)開始。
減2的原因是varchar頭部的2個字節(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 

示例二:若一張表中有一個字段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的原因是實際行存儲從第二個字節(jié)開始。
減2的原因是varchar頭部的2個字節(jié)表示長度。
減4的原因是a字段的int類型占4個字節(jié)。
減203的原因是char(20)占用60個字節(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
第一個減1的原因是實際行存儲從第二個字節(jié)開始。
第二個減1表示第二個varchar(50)頭部一個1個字節(jié)表示長度(小于255)。
減2的原因是varchar頭部的2個字節(jié)表示長度。
減202的原因是char(20)占用40個字節(jié),編碼是gbk。
減502的原因是varchar(50)占用100個字節(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類型一些需要注意的地方的詳細內容,更多關于Mysql varchar類型的資料請關注腳本之家其它相關文章!

相關文章

  • 如何解決局域網內mysql數據庫連接慢

    如何解決局域網內mysql數據庫連接慢

    通過內網連另外一臺機器的mysql服務, 確發(fā)現速度N慢! 等了大約幾十秒才等到提示輸入密碼。非常急人,有沒有辦法可以解決局域網內mysql數據庫連接慢呢?下面小編帶領大家來解決此問題,感興趣的朋友一起看看吧
    2015-09-09
  • phplib中的一些基本語法和函數

    phplib中的一些基本語法和函數

    phplib中常用的方法有set_file,set_block,set_var,parse,ppasre,p,get等。
    2010-04-04
  • 如何使用分區(qū)處理MySQL的億級數據優(yōu)化

    如何使用分區(qū)處理MySQL的億級數據優(yōu)化

    mysql在查詢上千萬級數據的時候,通過索引可以解決大部分查詢優(yōu)化問題。但是在處理上億數據的時候,應該怎么解決,本文就是用分區(qū)來優(yōu)化一下,感興趣的一起來了解一下
    2021-06-06
  • MySql游標的使用實例

    MySql游標的使用實例

    這篇文章主要介紹了MySql游標,需要的朋友可以參考下
    2014-06-06
  • MySQL中MVCC機制的實現原理

    MySQL中MVCC機制的實現原理

    這篇文章主要介紹了MySQL中MVCC機制的實現原理,MVCC多版本并發(fā)控制,MySQL中一種并發(fā)控制的方法,他主要是為了提高數據庫的讀寫性能,用更好的方式去處理讀寫沖突
    2022-08-08
  • 很全面的Mysql數據庫、數據庫表、數據基礎操作筆記(含代碼)

    很全面的Mysql數據庫、數據庫表、數據基礎操作筆記(含代碼)

    這篇文章主要為大家分享了很全面的Mysql數據庫、數據庫表、數據基礎操作筆記,感興趣的小伙伴們可以參考一下
    2016-04-04
  • 如何解決mysql導入sql文件慢、錯等問題

    如何解決mysql導入sql文件慢、錯等問題

    這篇文章主要介紹了如何解決mysql導入sql文件慢、錯等問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Mysql 錯誤too many connections解決方案

    Mysql 錯誤too many connections解決方案

    這篇文章主要介紹了Mysql 錯誤too many connections解決方案的相關資料,這里提供了如何解決此問題,需要的朋友可以參考下
    2016-11-11
  • MYSQL事務教程之Yii2.0商戶提現功能

    MYSQL事務教程之Yii2.0商戶提現功能

    這篇文章主要給大家介紹了關于MYSQL事務教程之Yii2.0商戶提現功能的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-07-07
  • mysql 使用inet_aton和inet_ntoa處理ip地址數據的實例

    mysql 使用inet_aton和inet_ntoa處理ip地址數據的實例

    下面小編就為大家?guī)硪黄猰ysql 使用inet_aton和inet_ntoa處理ip地址數據的實例。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04

最新評論

建昌县| 鹤峰县| 南澳县| 南陵县| 无极县| 同仁县| 祁连县| 柳州市| 峨眉山市| 神木县| 山阴县| 迁安市| 乌兰浩特市| 自治县| 蒲城县| 许昌市| 河北省| 商城县| 且末县| 兴城市| 周口市| 美姑县| 瓦房店市| 岳池县| 那曲县| 丹东市| 全椒县| 兴山县| 龙州县| 台山市| 江北区| 内江市| 崇左市| 兴安县| 池州市| 鹤山市| 西华县| 政和县| 珲春市| 仙居县| 黑龙江省|