關於SQL Server中的字元儲存的問題的測試
突然想到了資料庫中varchar和nvarchar以及字串字首'N'在實際應用中的問題,便做了一個小測試。測試的結論是我根據執行結果得出的。不完全正確,還請高手指點。
測試環境:windows server 2003 sp2 + sqlserver 2008 rtm
以下為測試的SQL語句:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->-- 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的結果為:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->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的結果為:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->nvarStr varStr rowNum
li li 1
li li 2
李培 li 7
李培 li 8
李培 李 11
李培 李 12
未插入行的報錯資訊皆為“將截斷字串或二進位制資料”。
由此可推論出:
SQLServer對於插入資料庫中資料的長度在兩方面同時加以限制:一、設定的最大字元數;二、由最大字元數得到的相應型別的最大位元組數。
由第2條插入語句的成功執行可推測出:
在某些情況下,即使英文字母前帶有字首'N',資料庫引擎在執行插入時有可能將資料隱式轉換成ASCII格式,以能夠將資料插入到資料庫。
因此,我們也可以知道,在建立表定義列時,為varchar和nvarchar指定的長度,既是在限定字元數,也是在限定位元組數。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-623980/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於SQLServer中的字元儲存的問題的測試SQLServer字元
- 關於SQL Server中儲存過程在C#中呼叫的簡單示例SQLServer儲存過程C#
- SQL Server儲存過程中raiserror的使用SQLServer儲存過程AIError
- 關於過濾字元的問題字元
- js中的儲存問題JS
- MySQL儲存過程中的sql_mode問題MySql儲存過程
- 關於字串中取相同的字元問題(小學題)字串字元
- 關於SQL Server的記憶體佔用問題SQLServer記憶體
- 關於jdon儲存,修改問題
- 關於資料庫中儲存中文的問題,請高手指點資料庫
- 關於SQL Server事務日誌的問題彙總SQLServer
- SQL SERVER 關於檔案儲存一些方法SQLServer
- SQL Server的datetime儲存格式SQLServer
- 關於java中String字元轉碼的幾個小測試Java字元
- 關於 App 啟動時間測試的問題APP
- 關於軟體測試的7個核心問題
- 關於非簇索引中儲存的簇索引的RID還是指標的問題索引指標
- 淺談SQL Server中的快照問題SQLServer
- 關於在BSTR中儲存二進位制資料的若干問題 (轉)
- SQL Server 深入解析索引儲存(中)SQLServer索引
- 關於效能測試時線上介面訪問比例的整理的問題
- SQL Server 儲存過程的運用SQLServer儲存過程
- (SQL Server)分頁的儲存過程SQLServer儲存過程
- 字元型別的字元儲存與位元組儲存字元型別
- SQL Server中TempDB管理(版本儲存區的一個example)SQLServer
- SQL Server中建立儲存過程時,with recompoile的作用SQLServer儲存過程
- 在 SQL Server 的儲存過程中呼叫 Com 元件 (轉)SQLServer儲存過程元件
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- Sql Server去除表中的不可見字元SQLServer字元
- 【MYSQL】一個關於Innodb儲存引擎表的加鎖問題MySql儲存引擎
- 關於資料庫 Block 儲存細節問題的討論資料庫BloC
- 聊聊密碼儲存中的安全問題密碼
- 關於 K8S 在測試中的疑問K8S
- 關於SQL server2008除錯儲存過程的完整步驟SQLServer除錯儲存過程
- SQL Server儲存過程的優缺點SQLServer儲存過程
- 關於檢視和儲存過程的許可權問題探究儲存過程
- 測試sql server全文索引,結果遇到問題SQLServer索引
- 關於Hibernate一對多關聯儲存問題