知識點001
當變數的資料型別為VARCHAR時,變數賦值后,變數中的字符所占位元組數,數字和字母是1個bytes,漢字是2個bytes;
當變數的資料型別為NVARCHAR時,變數賦值后,變數中的字符所占位元組數,數字、字母和漢字,均為2個bytes,
原因:NVARCHAR采用的字符集是unicode,unicode字符集中,無論是數字、字母、漢字,每個字符用2個bytes表示;
VARCHAR采用的字符集為非unicode,數字和字母用1個byte表示,漢字用2個bytes表示,
學會了這點,就可以很好的去解答這個問題:SQL字串長度計算,
知識點002
假定變數的資料型別是VARCHAR(N) ,含義是它能存盤的變數空間長度是N個bytes(注意,不是bit)
Sample:
DECLARE @name VARCHAR(10),
指變數@name的空間長度是10個位元組,
我們知道,一個漢字占2個bytes,假如我們設計一個駕校管理系統,設計資料庫的時候,將資料表欄位name的資料型別設為VARCHAR(10)
10個位元組,最多只能保存5個漢字,如果系統需要保存的人名長度大于5個漢字(比如俄羅斯總統普京,全名【弗拉基米爾·弗拉基米羅維奇·普京】,14個漢字,2個·字符),資料庫就會截取變數值,只保存10個位元組的內容,即【弗拉基米爾】,導致資訊缺失,但是如果將name的資料型別宣告為VARHCAR(32),問題就解決了,
PS:【弗拉基米爾·弗拉基米羅維奇·普京】漢字中間這個·(點號)
如果用搜狗輸入法的符號大全中的“標點符號”欄下的點號·,則占2個位元組存盤空間,上文普京全名中的點號,即為這個,
如果用搜狗輸入法的符號大全中的“特殊符號”欄下的點號?,則占1個位元組存盤空間,
SQL驗證:
DECLARE @name1 VARCHAR(10) DECLARE @name2 VARCHAR(32) SET @name1 = '弗拉基米爾·弗拉基米羅維奇·普京' SET @name2 = '弗拉基米爾·弗拉基米羅維奇·普京' SELECT @name1 AS name1,@name2 AS name2
執行結果:

值得注意的是,下面這個資料型別的空間長度問題,
假定變數的資料型別為NVARCHAR(N),含義是它能存盤的變數空間長度是(2*N)個bytes.
綜上,統一概念描述為:
1.SQL中,當宣告一個變數的資料型別是VARCHAR(N)時,含義是:該變數可以存盤空間長度為N個位元組(bytes)的資料;
2.SQL中,當宣告一個變數的資料型別是NVARCHAR(N)時,含義是:該變數可以容納字符長度為N個字符(characters)的資料,
SQL代碼驗證,PS:SQL server 版本:Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)
1 --漢字 2 CREATE TABLE dbo.Test1 (c1 NVARCHAR(4)); 3 INSERT dbo.Test1 VALUES ('美人她爹'); 4 SELECT DATALENGTH(c1) AS Bytes_of_Column_C1 FROM dbo.Test1; 5 6 CREATE TABLE dbo.Test2 (c2 VARCHAR(8)); 7 INSERT dbo.Test2 VALUES ('美人她爹'); 8 SELECT DATALENGTH(c2) AS Bytes_of_Column_C2 FROM dbo.Test2;
執行結果:

1 --數字 2 CREATE TABLE dbo.Test3 (c3 NVARCHAR(4)); 3 INSERT dbo.Test3 VALUES ('1234'); 4 SELECT DATALENGTH(c3) AS Bytes_of_Column_C3 FROM dbo.Test3; 5 6 CREATE TABLE dbo.Test4 (c4 VARCHAR(8)); 7 INSERT dbo.Test4 VALUES ('12345678'); 8 SELECT DATALENGTH(c4) AS Bytes_of_Column_C4 FROM dbo.Test4;
執行結果:

1 --字母 2 CREATE TABLE dbo.Test5 (c5 NVARCHAR(4)); 3 INSERT dbo.Test5 VALUES ('abcd'); 4 SELECT DATALENGTH(c5) AS Bytes_of_Column_C5 FROM dbo.Test5; 5 6 CREATE TABLE dbo.Test6 (c6 VARCHAR(8)); 7 INSERT dbo.Test6 VALUES ('abcdefgh'); 8 SELECT DATALENGTH(c6) AS Bytes_of_Column_C6 FROM dbo.Test6;
執行結果:

知識點003
上文提到兩個筆者自定義的概念,空間長度和字符長度,借用這兩個概念,說一下SQL中兩個函式 LEN()和DATALENGTH()的區別,
區別1
LEN()函式回傳值是字串的字符數目(the number of characters of the specified string expression),即字串的字符長度,
DATALENGTH()函式的回傳值是字串的字符所占空間,即字串的空間長度,
區別2
LEN()函式計算字串的字符長度時,不計算(包含)字串末尾空格(trailing spaces);
DATALENGTH()函式計算字串的空間長度時,計算(包含)字串末尾空格,
上述兩點區別,SQL驗證如下:
1 DECLARE @sql_string_VARCHAR VARCHAR(100) 2 DECLARE @sql_string_NVARCHAR NVARCHAR(100) 3 4 SET @sql_string_VARCHAR = 'ab c ' 5 SET @sql_string_NVARCHAR = 'ab c ' 6 7 SELECT LEN(@sql_string_VARCHAR) AS characters_of_sql_string_varchar, 8 LEN(@sql_string_NVARCHAR) AS characters_of_sql_string_nvarchar 9 SELECT DATALENGTH(@sql_string_VARCHAR) AS Bytes_of_sql_string_varchar, 10 DATALENGTH(@sql_string_NVARCHAR) AS Bytes_of_sql_string_nvarchar
執行結果:

本文來自博客園,作者:美人她爹,轉載請注明原文鏈接:https://www.cnblogs.com/fatherofbeauty/p/16096952.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/461901.html
標籤:SQL Server
