天天看點

SQL Server-資料類型(七)前言

前面幾篇文章我們講解了索引有關知識,這一節我們再繼續我們下面内容講解,簡短的内容,深入的了解,Always to review the basics。

SQL Server支援兩種字元資料類型,一種是正常,另外一種則是Unicode。正常資料類型包括CHAR和VARCHAR,Unicode資料類型包括NCAHR和NVARCHAR。正常字元的每個字元使用1個位元組存儲,而Unicode資料的每個字元要求2個位元組。正常字元列限制為僅僅隻針對于英語,而Unicode則是針對于多種語言。兩種字元資料類型的文本表示方式也不相同,在表示正常字元文本時,隻需要使用單引号,比如'Hello,my name is JeffckyWang,I'm from cnblogs',而對于Unicode字元文本時,需要指定字元N作為字首,即N‘Hello,my name is JeffckyWang,I'm from cnblogs’。

名稱中沒有VAR元素的任何資料類型(CHAR、NCHAR)具有固定長度,即SQL Server按照列定義大小保留行空間,而不是按照字元中的實際字元保留白間。比如某列定義大小為CHAR(25),則SQL Server在該行保留25個字元的空間,而不管存儲字元串的長度。

名稱中含有VAR元素的資料類型(VARCHAR、NVARCHAR)具有可變長度,即SQL Server根據存儲需要,在行中使用盡可能多的存儲空間存儲字元串,同時外加兩個額外的位元組偏移資料。例如,如果将某列定義為VARCHAR(25),此時支援的最大字元數為25,但實際上按照字元串中實際字元确定存儲量。-摘抄自SQL Server 2012 T-SQL基礎教程。

這裡關于Unicode字元資料類型我們需要重點了解下。我們先建立一個表,如下:

此時我們手動插入資料,正常插入,如下:

字元都完全插入表中,如下:

SQL Server-資料類型(七)前言

此時我們将firstname,插入五個中文試試如下:

此時出現如下結果:

SQL Server-資料類型(七)前言

也就是說在正常字元類型如上述VARVHAR中定義為五個字元,此時我們插入五個中文字元則會被截取,當然也插入不進去。因為上述已經明确講了1個非英語字元串相當于兩個位元組,此時中文所占用的是十個位元組,而此時VARCHAR才五個字元,是以出現警告。我們再來将firstname插入兩個中文兩個英文或者數字看看

此時插入進去為出現警告,因為此時兩個中文字元即四個位元組加上一個數字位元組剛好五個位元組,是以能正常插入,我們再來看看lastname,由上知,既然英文或者數字被當做一個位元組,那麼我們對lastname插入四個中文字元和兩個英文位元組剛好十個位元組應該是好使的。我們看看:

oh,shit,此時居然出錯了,如下:

SQL Server-資料類型(七)前言

我們上述分析的不是有理有據麼,難道這裡英文不是占用一個位元組麼,我們插入一個英文試試。

結果正确了,實踐是檢驗真理的唯一标準,從這裡我們可以看出:在正常字元中,一個中文會當做是兩個位元組來使用,一個英文會當做是一個位元組使用,但是在Unicode中,一個中文會當做兩個位元組來使用,但是一個英文也會當做是兩個位元組來使用。至此我們可以得出結論,個人一直以為在Unicode中,将英文是作為一個位元組存儲,見識短啊。

正常字元和Unicode中一個中文字元用兩個位元組存儲,而對英文,正常字元用一個位元組存儲,而Unicode依然是用兩個位元組存儲。

對字元串操作的函數有SUBSTRING、LEFT、RIGHT、CHARINDEX、PATINDEX、REPLACE、REPICATE、STUFF、UPPER、LOWER、RTRIM、LTRIM、FORMAT。對于簡單的函數我們略過,下面我們來講講幾個需要注意的地方。

我們首先建立如下測試表

我們插入測試資料

我們首先利用LEN函數來傳回firststr和secondstr的字元串長度大小

SQL Server-資料類型(七)前言

好極了,出錯了。LEN函數無法對TEXT進行操作。我們接着往下看。

SQL Server-資料類型(七)前言

此時未報錯誤,結果顯示為47個位元組大小。 既然LEN對文本無效,我們不對文本操作就是。

SQL Server-資料類型(七)前言

此時類型為VARCAHR的firststr位元組大小卻為31,為何,看到這裡我們想必恍然大悟,在上述我們講到正常字元會對中文以一個字元兩個位元組大小存儲,但是這裡實際上傳回的是實際字元大小,當然一個是存儲,一個是檢索,還是有點不同,同時我們也不會将中文存儲到VARCHAR中。到這裡我們可以得出結論。

結論:DATALENGTH函數是針對于TEXT,而LEN是針對于VARCHAR,對TEXT無效會報錯。

到這裡我們還有一個特殊值未進行處理,那就是NULL。那麼問題來了,LEN和DATALENGTH對NULL,它的長度大小是多少呢,是0還是不是0尼?

是我們來測試下:

SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言

我們上述得到的結果是LEN of NULL is NULL,DATALENGTH就不再示範了。

結論:LEN和DATALENGTH對于NULL計算的結果就是NULL。

我們再來看看二者差異的一個小地方:

SQL Server-資料類型(七)前言

結論:LEN會删除尾随空格,而DATALENGTH不會

CHARINDEX和PATINDEX字元串函數都是查詢傳回指定比對字元串的開始位置。

我們先查詢一個字元串,此字元串在表中存在,如下:

SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言

為何CHARINDEX函數查找到了,而PATINDEX沒有查詢到呢?此時就說說二者的差別,二者都有兩個參數,第二個參數都是要比對的字元串,但是PATINDEX函數必須在需要比對的字元串之前或者之後添加百分号即通配符,而CHARINDEX函數則不需要。如下即可:

SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言
SQL Server-資料類型(七)前言

結論:PATINDEX比對字元串必須在字元串前面或者後面或者前後添加通配符,而CHARINDEX無需添加。

本節我們主要講解了SQL中的資料類型以及幾個需要注意的地方,簡短的内容,深入的了解,我們下節再會。

本文轉自Jeffcky部落格園部落格,原文連結:http://www.cnblogs.com/CreateMyself/p/6123586.html,如需轉載請自行聯系原作者