MySQL學習筆記_關於MySQL的字符類型VARCHAR長度知識總結


MySQL學習筆記_關於MySQL的字符類型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.UTF8編碼介紹

http://zh.wikipedia.org/wiki/UTF8

2.查看字符集方法:

(1)查看MySQL數據庫服務器和數據庫MySQL字符集。

show variables like '%char%'; 

(2)查看MySQL數據表(table)的MySQL字符集。

show table status from dbName where name='tableName';

(3)查看MySQL數據列(column)的MySQL字符集。

show full columns from tableName;

 

參考:http://dinglin.iteye.com/blog/914276


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM