亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

詳解SQL Server中的數據類型

2024-08-31 01:04:23
字體:
來源:轉載
供稿:網友

前言

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

數據類型

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字符數據類型我們需要重點理解下。我們先創建一個表,如下:

CREATE TABLE UnicodeType( firstname VARCHAR(5) NOT NULL, lastname NVARCHAR(5) NOT NULL);

此時我們手動插入數據,正常插入,如下:

INSERT dbo.UnicodeType  ( firstname, lastname )VALUES ( '11111', -- firstname - varchar(5)   N'啊的發個好' -- lastname - nvarchar(5)   )

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

sqlserver,數據類型

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

INSERT dbo.UnicodeType  ( firstname, lastname )VALUES ( '達得到讓人', -- firstname - varchar(5)   N'達得到讓人' -- lastname - nvarchar(5)   )

此時出現如下結果:

sqlserver,數據類型

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

INSERT dbo.UnicodeType  ( firstname, lastname )VALUES ( '達得1', -- firstname - varchar(5)   N'達得到讓人' -- lastname - nvarchar(5)   )

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

INSERT dbo.UnicodeType  ( firstname, lastname )VALUES ( '達得1', -- firstname - varchar(5)   N'達得到讓ab' -- lastname - nvarchar(5)   )

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

sqlserver,數據類型

我們上述分析的不是有理有據么,難道這里英文不是占用一個字節么,我們插入一個英文試試。

INSERT dbo.UnicodeType  ( firstname, lastname )VALUES ( '達得1', -- firstname - varchar(5)   N'達得到讓b' -- lastname - nvarchar(5)   )

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

常規字符和Unicode中一個中文字符用兩個字節存儲,而對英文,常規字符用一個字節存儲,而Unicode依然是用兩個字節存儲。

字符串函數

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

LEN與DATALENGTH比較

我們首先創建如下測試表

CREATE TABLE StringFun( firststr VARCHAR(max) NOT NULL, secondstr TEXT NOT NULL);

我們插入測試數據

INSERT dbo.StringFun  ( firststr, secondstr )VALUES ( '我是JeffckyWang,我來自于博客園,專注于.NET技術', -- firststr - varchar(max)   '我是JeffckyWang,我來自于博客園,專注于.NET技術' -- secondstr - text   )

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

SELECT LEN(firststr) AS VARCAHRFieldSize FROM dbo.StringFunSELECT LEN(secondstr) AS TEXTFieldSize FROM dbo.StringFun

sqlserver,數據類型

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

SELECT DATALENGTH(firststr) AS VARCAHRFieldSize FROM dbo.StringFunSELECT DATALENGTH(secondstr) AS TEXTFieldSize FROM dbo.StringFun

sqlserver,數據類型

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

SELECT LEN(firststr) AS VARCAHRFieldSize FROM dbo.StringFunSELECT DATALENGTH(secondstr) AS TEXTFieldSize FROM dbo.StringFun

sqlserver,數據類型

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

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

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

是我們來測試下:

DECLARE @MyVar VARCHAR(10)SET @MyVar = NULLIF (LEN(@MyVar) = 0)PRINT 'LEN of NULL is 0'ELSEPRINT 'LEN of NULL is NULL'

sqlserver,數據類型

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

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

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

SELECT LEN('JeffckyWang ') AS 'LEN'SELECT DATALENGTH('JeffckyWang ') AS 'DATALENGTH'

sqlserver,數據類型

結論:LEN會刪除尾隨空格,而DATALENGTH不會

CHARINDEX與PATINDEX比較

CHARINDEX和PATINDEX字符串函數都是查詢返回指定匹配字符串的開始位置。

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

USE AdventureWorks2012;GOSELECT CHARINDEX('Worn', DocumentSummary) AS 'CHARINDEX'FROM Production.DocumentWHERE ChangeNumber = 55;GOSELECT PATINDEX('Worn', DocumentSummary) AS 'PATINDEX'FROM Production.DocumentWHERE ChangeNumber = 55;

sqlserver,數據類型

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

USE AdventureWorks2012;GOSELECT CHARINDEX('Worn', DocumentSummary) AS 'CHARINDEX'FROM Production.DocumentWHERE ChangeNumber = 55;GOSELECT PATINDEX('%Worn%', DocumentSummary) AS 'PATINDEX'FROM Production.DocumentWHERE ChangeNumber = 55;

sqlserver,數據類型

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

總結

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

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,同時也希望多多支持VeVb武林網!


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
黑人巨大精品欧美一区二区免费| 欧美黑人性猛交| 欧美贵妇videos办公室| 亚洲男人天堂手机在线| 欧美丰满片xxx777| 欧美大片网站在线观看| 欧美性视频在线| 精品福利樱桃av导航| 亚洲嫩模很污视频| 久久久免费在线观看| 日本一欧美一欧美一亚洲视频| 91美女福利视频高清| 国产亚洲精品久久| 亚洲欧美变态国产另类| 97久久久免费福利网址| 日韩视频免费中文字幕| 日韩电影在线观看永久视频免费网站| 亚洲精品一区二区久| 国产精品免费一区二区三区都可以| 色无极影院亚洲| 亚洲成年人影院在线| 国内精品免费午夜毛片| 不卡中文字幕av| 国产精品福利观看| 亚洲成人精品视频在线观看| 久久久久久久成人| 欧美成人国产va精品日本一级| 欧美日韩亚洲系列| 懂色av中文一区二区三区天美| 久久久久久一区二区三区| 最新日韩中文字幕| 日本伊人精品一区二区三区介绍| 国产精品网址在线| 久久久精品国产网站| 性欧美xxxx| 亚洲男人天堂视频| 国产精品伦子伦免费视频| 久久久国产精品视频| 91美女高潮出水| 8050国产精品久久久久久| 久久亚洲精品中文字幕冲田杏梨| 欧美一区二区三区免费观看| 亚洲女人天堂视频| 久久久噜噜噜久久久| 亚洲电影免费观看高清完整版在线| 91九色蝌蚪国产| 日韩视频一区在线| 国产免费亚洲高清| 国产日韩欧美自拍| 91免费观看网站| 欧美猛少妇色xxxxx| 亚洲欧美日韩天堂| 91精品国产网站| 国产福利视频一区| 麻豆精品精华液| 亚洲精品影视在线观看| 亚洲人a成www在线影院| 欧美另类69精品久久久久9999| 欧美高清激情视频| 97国产精品视频| 国产美女直播视频一区| 欧美黄色三级网站| 日韩va亚洲va欧洲va国产| 久久99青青精品免费观看| 欧美亚洲午夜视频在线观看| 日本精品久久电影| 亚洲国产精品国自产拍av秋霞| 久久久国产成人精品| 日韩av一区二区在线观看| 中文字幕欧美视频在线| 成人免费在线视频网站| 国内精品小视频| 91国产美女在线观看| 欧美又大粗又爽又黄大片视频| 亚洲天堂av在线播放| 最新91在线视频| 日韩禁在线播放| 日韩男女性生活视频| 亚洲国产精品国自产拍av秋霞| 国产精品久久9| 国产精品视频午夜| 日韩精品视频在线播放| 亚洲最大激情中文字幕| 欧美日韩人人澡狠狠躁视频| 国产精品视频专区| 91精品久久久久久久久久入口| 96sao精品视频在线观看| 欧美高清理论片| 国产精品日韩一区| 欧美大片免费观看在线观看网站推荐| 国产午夜精品全部视频播放| 高清亚洲成在人网站天堂| 欧美精品videosex性欧美| 欧美国产日韩精品| 8050国产精品久久久久久| 欧美日韩国产一区中文午夜| 欧洲亚洲妇女av| 国产精品久久综合av爱欲tv| 亚洲精品国偷自产在线99热| 久久伊人精品视频| 精品av在线播放| 亚洲国产成人精品久久久国产成人一区| 国产精品高潮呻吟久久av野狼| 国产福利精品视频| 在线性视频日韩欧美| 亚洲va久久久噜噜噜久久天堂| 国产亚洲日本欧美韩国| 国产欧美一区二区| 国产精品丝袜视频| 国产精品一区二区三区免费视频| 精品国产一区二区三区在线观看| 日韩精品视频在线| 亚洲欧美日本精品| 国产精品黄色影片导航在线观看| 亚洲一区二区三区视频| 欧美亚洲国产视频小说| 粗暴蹂躏中文一区二区三区| 中文在线资源观看视频网站免费不卡| 色偷偷噜噜噜亚洲男人| 亚洲香蕉av在线一区二区三区| 国产精品中文字幕在线观看| 久久久精品网站| 欧美成人精品一区| 日韩成人网免费视频| 亚洲国产成人爱av在线播放| 国产香蕉精品视频一区二区三区| 亚洲欧美综合区自拍另类| 欧美一级大片视频| 久久久久久美女| 国产精品久久久久久久久借妻| 午夜精品久久久久久99热| 亚洲free嫩bbb| 国产精品偷伦免费视频观看的| 九色成人免费视频| 亚洲2020天天堂在线观看| 色噜噜久久综合伊人一本| 日韩在线视频中文字幕| 国产精品吹潮在线观看| 色视频www在线播放国产成人| 国产精品91久久| 成人激情视频在线观看| 日韩免费av一区二区| 国产伦精品免费视频| 中文字幕精品视频| 亚洲精品日韩欧美| 国产主播精品在线| 国产一区二区三区直播精品电影| 欧美色图在线视频| 国产精品自拍偷拍视频| 亚洲视频在线观看免费| 久久久久久久av| 国产精品久久久久久久久久久久久| 亚洲石原莉奈一区二区在线观看| 国外成人性视频| 清纯唯美亚洲激情| 在线观看成人黄色| 日韩经典第一页| 国产精品一区二区久久久| 亚洲一级一级97网| 欧美一区二区大胆人体摄影专业网站| 美日韩精品视频免费看| 国产日产欧美a一级在线| 欧日韩不卡在线视频| 欧美午夜激情视频|