


SQL Server中的字符存儲(chǔ)的問(wèn)題
數(shù)據(jù)庫(kù)中varchar和nvarchar以及字符串前綴'N'在實(shí)際應(yīng)用中的問(wèn)題,便做了一個(gè)小測(cè)試。測(cè)試的結(jié)論是我根據(jù)運(yùn)行結(jié)果得出的。不完全正確,還請(qǐng)高手指點(diǎn)。
測(cè)試環(huán)境:windows server 2003 sp2(32bit) + sqlserver 2008 rtm
以下為測(cè)試的SQL語(yǔ)句:
-- 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的結(jié)果為:
length_DATALENGTH_1:2
length_DATALENGTH_2:4
length_DATALENGTH_3:4
length_DATALENGTH_4:8
length_DATALENGTH_5:4
length_DATALENGTH_6:4
由生成的結(jié)果可知:
在SQLServer2008中,對(duì)于漢字和英文字母的存儲(chǔ):
漢字:無(wú)論字符串前面是否加有前綴'N',都將中文隱式轉(zhuǎn)換為有'N'的類型,即Unicode字符,因?yàn)橹挥蠻niCode字符才能表示中文,1個(gè)字符占2個(gè)字節(jié)(即1個(gè)漢字占2個(gè)字節(jié))。
字母:有無(wú)前綴'N'的情況不同。當(dāng)沒有前綴'N'時(shí),默認(rèn)采用ASCII的方式編碼,1個(gè)字符占1個(gè)字節(jié)(即1個(gè)字母占1個(gè)字節(jié));當(dāng)有前綴'N'時(shí),則采用Unicode的方式編碼,1個(gè)字符占2個(gè)字節(jié)(即1個(gè)字母占2個(gè)字節(jié))。
INSERT Data的結(jié)果為:
nvarStr varStr rowNum
li li 1
li li 2
李培 li 7
李培 li 8
李培 李 11
李培 李 12
未插入行的報(bào)錯(cuò)信息皆為“將截?cái)嘧址蚨M(jìn)制數(shù)據(jù)”。
由此可推論出:
SQL Server對(duì)于插入數(shù)據(jù)庫(kù)中數(shù)據(jù)的長(zhǎng)度在兩方面同時(shí)加以限制:一、設(shè)置的最大字符數(shù);二、由最大字符數(shù)得到的相應(yīng)類型的最大字節(jié)數(shù)。
由第2條插入語(yǔ)句的成功執(zhí)行可推測(cè)出:
在某些情況下,即使英文字母前帶有前綴'N',數(shù)據(jù)庫(kù)引擎在執(zhí)行插入時(shí)有可能將數(shù)據(jù)隱式轉(zhuǎn)換成ASCII格式,以能夠?qū)?shù)據(jù)插入到數(shù)據(jù)庫(kù)。
因此,我們也可以知道,在創(chuàng)建表定義列時(shí),為varchar和nvarchar指定的長(zhǎng)度,既是在限定字符數(shù),也是在限定字節(jié)數(shù)。
關(guān)鍵字:SQL Server、數(shù)據(jù)庫(kù)
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無(wú)AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解