SQL Server中的字符存儲的問題
數據庫中varchar和nvarchar以及字符串前綴'N'在實際應用中的問題,便做了一個小測試。測試的結論是我根據運行結果得出的。不完全正確,還請高手指點。
測試環境:windows server 2003 sp2(32bit) + sqlserver 2008 rtm
以下為測試的SQL語句:
-- Create Table
USE DBUser;
IF OBJECT_ID('dbo.Test','U') IS NOT NULL
DROP TABLE dbo.Test;
CREATE TABLE dbo.Test
(
nvarStr NVARCHAR(2) NULL,
varStr VARCHAR(2) NULL,
rowNum INT NULL
);
-- Get DataLength
SELECT length_DATALENGTH_1 = DATALENGTH('li');
SELECT length_DATALENGTH_2 = DATALENGTH('lili');
SELECT length_DATALENGTH_3 = DATALENGTH(N'li');
SELECT length_DATALENGTH_4 = DATALENGTH(N'lili');
SELECT length_DATALENGTH_5 = DATALENGTH('李培');
SELECT length_DATALENGTH_6 = DATALENGTH(N'李培');
-- INSERT Data
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('li','li',1);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'li',N'li',2);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('lili','li',3);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'lili',N'li',4);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('li','李培',5);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'li',N'李培',6);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','li',7);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'li',8);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','李培',9);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'李培',10);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES('李培','李',11);
INSERT INTO dbo.Test(nvarStr,varStr,rowNum) VALUES(N'李培',N'李',12);
-- Query Data
SELECT * FROM dbo.Test;
---------------------------------------------------------
Get DataLength的結果為:
length_DATALENGTH_1:2
length_DATALENGTH_2:4
length_DATALENGTH_3:4
length_DATALENGTH_4:8
length_DATALENGTH_5:4
length_DATALENGTH_6:4
由生成的結果可知:
在SQLServer2008中,對于漢字和英文字母的存儲:
漢字:無論字符串前面是否加有前綴'N',都將中文隱式轉換為有'N'的類型,即Unicode字符,因為只有UniCode字符才能表示中文,1個字符占2個字節(即1個漢字占2個字節)。
字母:有無前綴'N'的情況不同。當沒有前綴'N'時,默認采用ASCII的方式編碼,1個字符占1個字節(即1個字母占1個字節);當有前綴'N'時,則采用Unicode的方式編碼,1個字符占2個字節(即1個字母占2個字節)。
INSERT Data的結果為:
nvarStr varStr rowNum
li li 1
li li 2
李培 li 7
李培 li 8
李培 李 11
李培 李 12
未插入行的報錯信息皆為“將截斷字符串或二進制數據”。
由此可推論出:
SQL Server對于插入數據庫中數據的長度在兩方面同時加以限制:一、設置的最大字符數;二、由最大字符數得到的相應類型的最大字節數。
由第2條插入語句的成功執行可推測出:
在某些情況下,即使英文字母前帶有前綴'N',數據庫引擎在執行插入時有可能將數據隱式轉換成ASCII格式,以能夠將數據插入到數據庫。
因此,我們也可以知道,在創建表定義列時,為varchar和nvarchar指定的長度,既是在限定字符數,也是在限定字節數。
關鍵字:SQL Server、數據庫
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解