萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql中VARCHAR長度詳細介紹

mysql中VARCHAR長度詳細介紹

本文章介紹了關於在mysql中varchar數據類型的字符長度及相關的參數,有需要了解的同學可以參考一下本文章。

 

在MySQL5.0以上的版本中,varchar數據類型的長度支持到了65535,也就是說可以存放65532個字節的數據,起始位和結束位占去了3個字節,也就是說,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的數據可以使用可變長的varchar來存放,這樣就能有效的減少數據庫文件的大小。

一.VARCHAR存儲和行長度限制

1.VARCHAR(N)中,N指的是字符的長度,VARCHAR類型最大支持65535,指的是65535個字節,但並不支持65535長度的varchar,65535中應該包含了所有字段的長度、變長字段長度標示位、NULL標示位的累計。其中內容開頭用1到2個字節表示實際長度(長度超過255時需要2個字節)。所以還有別的開銷,實際能存放的長度為65532.

(MySQL數據庫的varchar類型在5.0.3以下的版本中的最大長度限制為255,其數據范圍可以是0~255)

wps_clip_image-1585

2.因為null標示位占用了一個字節,所以可以去掉not null限制。

wps_clip_image-2415

 

3.MySQL要求一個行的定義長度不能超過65535 是指所有列的長度總和不能超過65535.如果列的長度總和超過這個長度,依然無法創建.

 

wps_clip_image-4025

二.VARCHAR長度的編碼限制

1.概述

字符類型若為gbk,每個字符最多占2個字節,最大長度不能超過32766;

字符類型若為utf8,每個字符最多占3個字節,最大長度不能超過21845。

若定義的時候超過上述限制,則varchar字段會被強行轉為text類型,並產生warning。

2.舉例

(1)若一個表只有一個varchar類型,如定義為

create table t4(c varchar(N)) charset=gbk;

則此處N的最大值為(65535-1-2)/2= 32766。

減1的原因是實際行存儲從第二個字節開始’;

減2的原因是varchar頭部的2個字節表示長度;

除2的原因是字符編碼是gbk。

(2) 若一個表定義為

create table t4(c int, c2 char(30), c3 varchar(N)) charset=utf8;

則此處N的最大值為 (65535-1-2-4-30*3)/3=21812

減1和減2與上例相同;

減4的原因是int類型的c占4個字節;

減30*3的原因是char(30)占用90個字節,編碼是utf8。

如果被varchar超過上述的b規則,被強轉成text類型,則每個字段占用定義長度為11字節,當然這已經不是“varchar”了。

 

三.關於SQL模式

在MySQL中,SQL模式常用來解決下面幾類問題:

1.通過設置SQL Mode,可以完成不同嚴格程度的數據校驗,有效地保障數據准確性。

2.通過設置SQL Mode為ANSI模式,來保證大多數SQL符合標准的SQL語法,這樣應用在不同數據庫之間進行遷移時,則不需要對業務SQL進行較大的修改。

3.在不同數據庫之間進行數據遷移之前,通過設置SQL Mode可以使MySQL上的數據更方便地遷移到目標數據庫中。

查看當SQL模式

mysql>select @@sql_mode;

wps_clip_image-10668

STRICT_TRANS_TABLES(嚴格模式) 實現數據的嚴格校驗,使錯誤數據不能插入表中.

如果將sql_mode設為'',則可能會出現可以建立表,但是會有一條警告信息,

mysql>set session sql_mode='';

mysql>create table test4(a varchar(25000)) charset=utf8;

mysql>show warnings;

警告信息提示了,之所以可以創建,是因為MySQL自動將VARCHAR轉換成了Text類型。

mysql>show create table test4;

wps_clip_image-32465

1、限制規矩

 

字段的限制在字段定義的時辰有以下規矩:

 

a)    存儲限制

 

       varchar 字段是將實際內容零丁存儲在聚簇索引之外,內容開首用1到2個字節默示實際長度(長度跨越255時須要2個字節),是以最大長度不克不及跨越65535。

 

b)    編碼長度限制

 

     字符類型若為gbk,每個字符最多占2個字節,最大長度不克不及跨越32766;

 

  字符類型若為utf8,每個字符最多占3個字節,最大長度不克不及跨越21845。

 

  對於英文斗勁多的論壇 ,應用GBK則每個字符占用2個字節,而應用UTF-8英文卻只占一個字節。

 

  若定義的時辰跨越上述限制,則varchar字段會被強行轉為text類型,並產生warning。

 

c)    行長度限制

 

  導致實際應用中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。

 

如果某一項中設置的是varchar(50)
那麼對英文當然是50
那麼對中文呢
utf-8的中文占3個字節
那麼,這個varchar(50)是不是只能存16個漢字了?
mysql varchar(50) 不管中文 還是英文 都是存50個的

MySQL5的文檔,其中對varchar字段類型這樣描述:varchar(m) 變長字符串。M 表示最大列長度。M的范圍是0到65,535。(VARCHAR的最大實際長度由最長的行的大小和使用的字符集確定,最大有效長度是65,532字節)。
為何會這般變換?真是感覺MySQL的手冊做的太不友好了,因為你要仔細的繼續往下讀才會發現這段描述:MySQL 5.1遵從標准SQL規范,並且不刪除VARCHAR值的尾部空格。VARCHAR保存時用一個字節或兩個字節長的前綴+數據。如果VARCHAR列聲明的長度大於255,長度前綴是兩個字節。
好了,貌似懂了一點。但具體他說的長度大於255時使用2個字節長度前綴,小學減法題:65535 - 2 = 65533啊。不知道這些大牛如何計算的,暫且保留疑問吧?
注:我測試了一下使用UTF8編碼,varchar的最大長度為21854字節。
在mysql 5.0.45版本,數據庫編碼utf8下進行測試:varchar最長定義為21785。也就是說不論字母、數字、漢字,只能放21785個。
推想:varchar字節最大65535,utf8編碼一個字符3個字節65535/3=21785。

copyright © 萬盛學電腦網 all rights reserved