關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Sqlserver中的儲存過程SQLServer儲存過程
- js中的儲存問題JS
- 關於 App 啟動時間測試的問題APP
- 關於軟體測試的7個核心問題
- 面試有關字串中字元出現重複字元的面試問題,這裡都有了面試字串字元
- 關於效能測試時線上介面訪問比例的整理的問題
- 關於SQLServer的tempdb的資料檔案暴增問題(1)SQLServer
- 關於 K8S 在測試中的疑問K8S
- Python3中關於cookie的建立與儲存PythonCookie
- 關於使用 Appium 的 wda 測試 IOS 的 XCUI 框架 app 中元素的問題APPiOSUI框架
- 關係等級儲存問題
- 面試中關於nginx的問答面試Nginx
- 效能測試 有關 service mesh 的問題
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- SqlServer儲存過程的建立與使用SQLServer儲存過程
- 關於Integer面試的一個問題面試
- 關於 pytest Case 遇到重試的問題
- 關於工作中遇到的問題
- 關於cuda中的函式問題函式
- 儲存自動化、預測分析和人工智慧的六個關鍵問題人工智慧
- 關於 Swoft 2.0 版本用 Redis 儲存 session 時配置問題RedisSession
- Servlet中關於web.xml的測試ServletWebXML
- 關於 Appium 中 ios 自動化測試的幾個問題,請教下大神,謝謝APPiOS
- Sqlserver資料庫儲存路徑的修改SQLServer資料庫
- 關於this指向的問題
- 面試中關於Redis的問題看這篇就夠了面試Redis
- 關於python中填充缺失值的問題Python
- 關於setInterval和setTImeout中的this指向問題
- 關於 mysql 中的 rand () 查詢問題MySql
- 相同 App 同步迭代中的測試問題APP
- 關於軟體測試七個核心問題
- Kylin儲存和查詢的分片問題
- mysql多次呼叫儲存過程的問題MySql儲存過程
- 【爬坑日記】Mac中Excel儲存csv格式檔案 字元亂碼問題MacExcel字元
- SQLSERVER儲存過程SQLServer儲存過程
- 基於儲存過程的百萬級測試資料自動生成儲存過程
- vue中關於測試的知識介紹Vue
- sqlserver關於always on的總結SQLServer
- 有關介面測試的用例設計問題