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)
2.因為null標示位占用了一個字節,所以可以去掉not null限制。
3.MySQL要求一個行的定義長度不能超過65535 是指所有列的長度總和不能超過65535.如果列的長度總和超過這個長度,依然無法創建. www.2cto.com
二.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”了。 www.2cto.com
三.關於SQL模式
在MySQL中,SQL模式常用來解決下面幾類問題:
1.通過設置SQL Mode,可以完成不同嚴格程度的數據校驗,有效地保障數據准確性。
2.通過設置SQL Mode為ANSI模式,來保證大多數SQL符合標准的SQL語法,這樣應用在不同數據庫之間進行遷移時,則不需要對業務SQL進行較大的修改。
3.在不同數據庫之間進行數據遷移之前,通過設置SQL Mode可以使MySQL上的數據更方便地遷移到目標數據庫中。
查看當SQL模式
mysql>select @@sql_mode;
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;
附:
1.UTF8編碼介紹
http://zh.wikipedia.org/wiki/UTF8
2.查看字符集方法: www.2cto.com
(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://www.BkJia.com/database/201206/136787.html
作者 一片相思林