1. 程式人生 > >sql server dba常用概念、操作分析

sql server dba常用概念、操作分析

mss 英文 har 足夠 庫文件 動態 導致 bsp info

1.設計表時如何使用char 與 varchar? 請寫出你對varchar(max)的理解。

1.設計表時如何使用char 與 varchar? 請寫出你對varchar(max)的理解。

char:是定長的,也就是當你輸入的字符小於你指定的數目時,會在後面補空值。比如定義char(10),你輸入的字符小於10時,它會再後面補空值。當你輸入的字符大於10時,它會截取超出的字符,總之都會占10個字節的空間。char存儲定長數據很方便,char字段上的索引效率極高,因為是固定長度,所以速度效率高。一個英文字符占一個字節,一個漢字兩個字節。(由於char是以固定長度的,所以它的速度會比varchar快得多!但程序處理起來要麻煩一點,要用trim之類的函數把兩邊的空格去掉!)

nvarchar(n):包含 n 個字符的可變長度 Unicode 字符數據。n 的值必須介於 1 與 4,000 之間。最多可存儲4000個字符,無論英文還是漢字都占2個字符。

varchar:如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 Varchar(10)是最合算的。存儲變長數據,所以不以空格填滿,但存儲效率沒有CHAR高。Varchar類型的實際長度是它的值的實際長度+1。為什麽“+1”呢?這一個字節用於保存實際使用了多大的長度。 最多8000個英文,4000個漢字。

varchar一般適用於英文和數字,Nvarchar適用中文和其他字符。

sqlserver中varchar最大長度是8000,但是可以使用varchar(max),可以達到2G。(解釋:數據庫文件由區組成的,而區由八個物理上連續的頁組成,頁是SQL中存儲數據的基礎單位,數據就記錄存在數據頁。一個頁大小為8K(8192字節),數據庫中的數據文件(.mdf 或.ndf)分配的磁盤空間可以從邏輯上劃分成頁(從 0 到 n 連續編號)。磁盤 I/O 操作在頁級執行,也就是說,SQL Server 每次讀取或寫入數據的最少數據單位是數據頁。數據頁由頁頭(96字節),數據行,行偏移量(最少36個字節)三部分組成,所以數據行的最大長度是8x1024-96-36-7=8060,7表示SQL Server還需要對每一行的數據最少附加7字節的系統數據。)

varchar(max):

在MSSQL2005及以上的版本中,加入大值數據類型(varchar(max)、nvarchar(max)、varbinary(max))。大值數據類型最多可以存儲2^30-1個字節的數據。
這幾個數據類型在行為上和較小的數據類型 varchar、nvarchar 和 varbinary 相同。
微軟的說法是用這個數據類型來代替之前的text、ntext 和 image 數據類型,它們之間的對應關系為:
varchar(max)-------text;
nvarchar(max)-----ntext;
varbinary(max)----image.

varchar(max):字符串被截斷

replicate(‘str‘,n):輔助n個str字符串

declare @test varchar(max) set @test=replicate(‘1‘,9000) print len(@test) 解決辦法 (1)使用強制轉換 set @test=replicate(convert(varchar(max),‘1‘),9000)--強制轉換為varchar(max)。 print len(@test) (2)把9000個字符拆分成2個部分,每個部分都少於8000 set @test=replicate(convert(varchar(max),‘1‘),4000)+replicate(convert(varchar(max),‘1‘),5000) print len(@test) 在sql server ssms中使用select 查詢結果,非XML格式默認1行最多只允許存在65535個字符,而print 一行只能輸出8000個字符。所以要輸出查看內容可以將結果內容另存為csv文件。 也可以把結果數據轉成XML格式,代碼如下:
SELECT CAST(‘<A><![CDATA[‘ + CAST(@test as nvarchar(max)) + ‘]]></A>‘ as xml) 參考:http://blog.csdn.net/z10843087/article/details/77584905 http://www.bubuko.com/infodetail-1883338.html 總結:

  1,兩個不超過8000長度的“字符串自身”相加,相加之後默認總長度是不超過8000的,如果相加之後的長度超過8000,超過8000的部分會被截斷

原理:(字符串默認是char型,char型最大為8000字符,所以想加超過8000會被截斷)

  2,相加的兩個字符串中有一個長度超過了8000,相加兩個字符串本身之後的結果是不會被截斷的。

原理:(因為超過8000的字符串默認用varchar(max)/text來臨時存儲了,最大可以存2^31-1,所以可以容納超過8000的)

  3,不管字符串長度如何,將字符串賦值給varchar(max)變量之後,用“變量相加”的方式相加,賦值給第三個varchar(max)變量,其結果是不會被截斷的。

所以:當無法預計相加的兩個字符串本身的長度是多少,以及相加之後的長度是多少的時候,

   請不要直接對兩個字符串本身進行相加(+)操作,為了確保萬無一失,請將字符串賦值給varchar(max)變量之後,用變量相加,因為用變量相加的方式總是會沒有問題的。(或者把字符串強行數據類型成varchar(max)或者text一類)

? 比較:

1.定長或變長

所謂定長就是長度固定,當要保存的數據長度不夠時將自動在其後面填充英文空格,使長度達到相應的長度;有var前綴的,表示是實際存儲空間是動態變化的,比如varchar,nvarchar變長字符數據則不會以空格填充。

2.Unicode或非Unicode

數據庫中,英文字符只需要一個字節存儲就足夠了,但漢字和其他眾多非英文字符,則需要兩個字節存儲。如果英文與漢字同時存在,由於占用空間數不同,容易造成混亂,導致讀取出來的字符串是亂碼。Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。而前綴n就表示Unicode字符,比如nchar,nvarchar,這兩種類型使用了Unicode字符集。

3.幾種數據類型的存儲的最大容量

char,varchar 最多8000個英文,4000個漢字

nchar,nvarchar 最多可存儲4000個字符,無論英文還是漢字

sql server dba常用概念、操作分析