LENGTH_IN_CHAR:
VARCHAR 類型對象的長度是否以字符為單位。取值:1、Y表示是,0、N表示否。默認值為0。可選參數
1 或Y:是,所有VARCHAR類型對象的長度以字符為單位。這種情況下,定義長度並非真正按照字符長度調整,而是將存儲長度值按照理論字符長度進行放大。所以會出現實際可插入字符數超過定義長度的情況,這種情況也是允許的。同時,存儲的字節長度 8188 上限仍然不變,也就是說,即使定義列長度為 8188 字符,其實際能插入的字符串占用總字節長度仍然不能超過8188;
0 或N:否,所有VARCHAR 類型對象的長度以字節為單位。
---------------------------------------------------------------------------------------------
創建實例的時候,該參數默認為0,varchar類型的字段長度是以字節為單位,那么該參數為0和1的時候,以及編碼選擇GB18030和UNICODE的時候,varchar類型字段存入的實際情況又是如何呢?下面通過不同的場景測試結果來給出一個確定的答案。
共用的建表語句如下:
create table test(c1 varchar(10));
table test(c1 varchar(10));
一、UNICODE_FLAG=0,LENGTH_IN_CHAR=0
--插入10個英文,正常
插入10個英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11個英文,錯誤
插入11個英文,錯誤
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');
--插入5個中文,正常
插入5個中文,正常
insert into test(c1) values('測試一下測');
into test(c1) values('測試一下測');
--插入6個中文,錯誤
插入6個中文,錯誤
insert into test(c1) values('測試一下測試');
into test(c1) values('測試一下測試');
二、UNICODE_FLAG=0,LENGTH_IN_CHAR=1
--插入10個英文,正常
插入10個英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11個英文,正常
插入11個英文,正常
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');
--插入20個英文,正常
插入20個英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入21個英文,錯誤
插入21個英文,錯誤
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJABCDEFGHIJA');
--插入10個中文,正常
插入10個中文,正常
insert into test(c1) values('測試一下測試一下測試');
into test(c1) values('測試一下測試一下測試');
--插入11個中文,錯誤
插入11個中文,錯誤
insert into test(c1) values('測試一下測試一下測試一');
into test(c1) values('測試一下測試一下測試一');
--插入10個中文1個英文,錯誤
插入10個中文1個英文,錯誤
insert into test(c1) values('測試一下測試一下測試A');
into test(c1) values('測試一下測試一下測試A');
三、UNICODE_FLAG=1,LENGTH_IN_CHAR=0
--插入10個英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入11個英文,錯誤
insert into test(c1) values('ABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJA');
--插入5個中文,正常
insert into test(c1) values('測試一');
into test(c1) values('測試一');
--插入5個中文1個英文,正常
insert into test(c1) values('測試一A');
into test(c1) values('測試一A');
--插入6個中文,錯誤
insert into test(c1) values('測試一下');
into test(c1) values('測試一下');
--插入5個中文2個英文,錯誤
insert into test(c1) values('測試一AB');
into test(c1) values('測試一AB');
四、UNICODE_FLAG=1,LENGTH_IN_CHAR=1
--插入10個英文,正常
insert into test(c1) values('ABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJ');
--插入20個英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入40個英文,正常
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
--插入41個英文,錯誤
insert into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');
into test(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');
--插入10個中文,正常
insert into test(c1) values('測試一下測試一下測試');
into test(c1) values('測試一下測試一下測試');
--插入13個中文,正常
insert into test(c1) values('測試一下測試一下測試一下測');
into test(c1) values('測試一下測試一下測試一下測');
--插入14個中文,錯誤
insert into test(c1) values('測試一下測試一下測試一下測試');
into test(c1) values('測試一下測試一下測試一下測試');
--插入13個中文1個英文,正常
insert into test(c1) values('測試一下測試一下測試一下測A');
into test(c1) values('測試一下測試一下測試一下測A');
--插入13個中文2個英文,錯誤
insert into test(c1) values('測試一下測試一下測試一下測AB');
into test(c1) values('測試一下測試一下測試一下測AB');
綜合測試結果得出結論如下:
配置 字段長度 英文存儲個數 中文存儲個數 實際字節數 備注
UNICODE_FLAG=0
LENGTH_IN_CHAR=0 VARCHAR(10) 10 5 10 中文占2字節
UNICODE_FLAG=0
LENGTH_IN_CHAR=1 VARCHAR(10) 20 10 20 中文站2字節,以字符為單位,
自動擴充為雙倍字節數
UNICODE_FLAG=1
LENGTH_IN_CHAR=0 VARCHAR(10) 10 3.3 10 中文占3字節
UNICODE_FLAG=1
LENGTH_IN_CHAR=1 VARCHAR(10) 40 13.3 40 中文站3字節,以字符為單位,
自動擴充為4倍
————————————————
版權聲明:本文為CSDN博主「fachu121」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/fachu121/article/details/105290551/