關於SQLServer中的字元儲存的問題的測試
突然想到了資料庫中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-625136/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於SQL Server中的字元儲存的問題的測試SQLServer字元
- Sqlserver中的儲存過程SQLServer儲存過程
- 關於過濾字元的問題字元
- js中的儲存問題JS
- 關於字串中取相同的字元問題(小學題)字串字元
- 關於jdon儲存,修改問題
- 關於資料庫中儲存中文的問題,請高手指點資料庫
- 關於java中String字元轉碼的幾個小測試Java字元
- 關於 App 啟動時間測試的問題APP
- 關於軟體測試的7個核心問題
- 關於非簇索引中儲存的簇索引的RID還是指標的問題索引指標
- 關於在BSTR中儲存二進位制資料的若干問題 (轉)
- 關於效能測試時線上介面訪問比例的整理的問題
- 字元型別的字元儲存與位元組儲存字元型別
- 【MYSQL】一個關於Innodb儲存引擎表的加鎖問題MySql儲存引擎
- 關於資料庫 Block 儲存細節問題的討論資料庫BloC
- 聊聊密碼儲存中的安全問題密碼
- 關於 K8S 在測試中的疑問K8S
- 關於檢視和儲存過程的許可權問題探究儲存過程
- 關於Hibernate一對多關聯儲存問題
- 關於SQLServer的tempdb的資料檔案暴增問題(1)SQLServer
- 使用UDL測試SQLServer連線問題SQLServer
- 軟體測試中存在的問題
- 關於MYSQL中FLOAT和DOUBLE型別的儲存MySql型別
- 關於儲存過程中不能操作其他使用者表資料的問題解決儲存過程
- 請大家幫忙,關於儲存過程分頁的問題...謝謝儲存過程
- url中的特殊字元問題字元
- ORACLE儲存過程中建立子過程的測試!Oracle儲存過程
- 簡單的鍵值儲存測試
- Servlet中關於web.xml的測試ServletWebXML
- 關於 Exception:Xml中的非法字元ExceptionXML字元
- 關於資料倉儲和OLAP的問題!
- 關於使用 Appium 的 wda 測試 IOS 的 XCUI 框架 app 中元素的問題APPiOSUI框架
- ORACLE中儲存過程的許可權問題Oracle儲存過程
- MySQL儲存過程中的sql_mode問題MySql儲存過程
- 關於工作中遇到的問題
- 關於cuda中的函式問題函式
- 關於 iOS 10 中 ATS 的問題iOS