當(dāng)前位置: 首頁IT技術(shù) → 在SQL 中 ntext和text類型的的區(qū)別

在SQL 中 ntext和text類型的的區(qū)別

更多

ntext和text一樣用來保存大量的文字數(shù)據(jù),不過text用單字節(jié)保存數(shù)據(jù) ,ntext固定用雙字節(jié)保存數(shù)據(jù). ntext保存的是Uncode的字符 , ntext支持跨語言平臺。

ntext:

可變長度 Unicode 數(shù)據(jù)的最大長度為 230 - 1 (1,073,741,823) 個字符。存儲大小是所輸入字符個數(shù)的兩倍(以字節(jié)為單位)。ntext 在 SQL-92 中的同義詞是 national text。

ntext中存數(shù)據(jù)是按雙字節(jié)存的 ,顯示不了NTEXT你換一下recordset打開方式就行了

text:
服務(wù)器代碼頁中的可變長度非 Unicode 數(shù)據(jù)的最大長度為 231-1 (2,147,483,647) 個字符。當(dāng)服務(wù)器代碼頁使用雙字節(jié)字符時,存儲量仍是 2,147,483,647 字節(jié)。存儲大小可能小于 2,147,483,647 字節(jié)(取決于字符串)。

char、varchar、text和nchar、nvarchar、ntext的區(qū)別

1、CHAR。CHAR存儲定長數(shù)據(jù)很方便,CHAR字段上的索引效率級高,比如定義char(10),那么不論你存儲的數(shù)據(jù)是否達到了10個字節(jié),都要占去10個字節(jié)的空間,不足的自動用空格填充。

2、VARCHAR。存儲變長數(shù)據(jù),但存儲效率沒有CHAR高。如果一個字段可能的值是不固定長度的,我們只知道它不可能超過10個字符,把它定義為 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。為什么“+1”呢?這一個字節(jié)用于保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關(guān)鍵是根據(jù)實際情況找到權(quán)衡點。

3、TEXT。text存儲可變長度的非Unicode數(shù)據(jù),最大長度為2^31-1(2,147,483,647)個字符。

4、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個“N”。它表示存儲的是Unicode數(shù)據(jù)類型的字符。我們知道字符中,英文字符只需要一個字節(jié)存儲就足夠了,但漢字眾多,需要兩個字節(jié)存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產(chǎn)生的,它所有的字符都用兩個字節(jié)表示,即英文字符也是用兩個字節(jié)表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字?梢钥闯鍪褂胣char、nvarchar數(shù)據(jù)類型時不用擔(dān)心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數(shù)量上有些損失。


對于什么時候用varchar和nvarchar沒有說一定的.
也就是說一個漢字既可以存在varchar中,也可以存在nvarchar中.
那么對于漢字或者Unicode 數(shù)據(jù)到底存在varchar和nvarchar有什么區(qū)別呢?
下面例子說明一下:一個漢字占varchar(2),只占nvarchar(1),而字母只占varchar(1),那么在數(shù)據(jù)庫字段求長度的時候,用varchar你就不一定知道它確切的知道它到底有幾個字,如果用nvarchar,那么漢字也是nvarchar(1),字母也是nvarchar(1),那么已經(jīng)很明顯了.
區(qū)別2:varchar的檢索快于nvarchar,雖然是這樣但微軟下一個版本將統(tǒng)一nvarchar,聽說的

管理 ntext、text 和 image 數(shù)據(jù)

Microsoft® SQL Server™ 的 ntext、text 和 image 數(shù)據(jù)類型在單個值中可以包含非常大的數(shù)據(jù)量(最大可
   達 2 GB)。單個數(shù)據(jù)值通常比應(yīng)用程序在一個步驟中能夠檢索的大;某些值可能還會大于客戶端的可用虛擬內(nèi)存。因此,
   在檢索這些值時,通常需要一些特殊的步驟。
  
   如果 ntext、text 和 image 數(shù)據(jù)值不超過 Unicode 串、字符串或二進制串的長度(分別為 4,000 個字符、8,000 個字
   符和 8,000 個字節(jié)),就可以在 SELECT、UPDATE 和 INSERT 語句中引用它們,其引用方式與較小的數(shù)據(jù)類型相同。例
   如,包含短值的 ntext 列可以在 SELECT 語句的選擇列表中引用,這與 nvarchar 列的引用方式相同。引用時必須遵守一
   些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。這些列可以作為返回其它數(shù)據(jù)類型(例如
   ISNULL、SUBSTRING 或 PATINDEX)的某個函數(shù)的參數(shù)包含在 WHERE 子句中,也可以包含在 IS NULL、IS NOT NULL 或
   LIKE 表達式中。
  
   處理較大的數(shù)據(jù)值
   但是,如果 ntext、text 和 image 數(shù)據(jù)值較大,則必須逐塊處理。Transact-SQL 和數(shù)據(jù)庫 API 均包含使應(yīng)用程序可以
   逐塊處理 ntext、text 和 image 數(shù)據(jù)的函數(shù)。
  
   數(shù)據(jù)庫 API 按照一種通用的模式處理長 ntext、text 和 image 列:
  
   若要讀取一個長列,應(yīng)用程序只需在選擇列表中包含 ntext、text 或 image 列,并將該列綁定到一個程序變量,該變量
   應(yīng)足以容納適當(dāng)?shù)臄?shù)據(jù)塊。然后,應(yīng)用程序就可以執(zhí)行該語句,并使用 API 函數(shù)或方法將數(shù)據(jù)逐塊檢索到綁定的變量中。
  
  
   若要寫入一個長列,應(yīng)用程序可使用參數(shù)標(biāo)記 (?) 在相應(yīng)位置代替 ntext、text 或 image 列中的值,以執(zhí)行 INSERT
   或 UPDATE 語句。參數(shù)標(biāo)記(對 ADO 而言則為參數(shù))被綁定到一個足以容納數(shù)據(jù)塊的程序變量上。應(yīng)用程序進入循環(huán),在
   循環(huán)中先將下一組數(shù)據(jù)移到綁定的變量中,然后調(diào)用 API 函數(shù)或方法寫入數(shù)據(jù)塊。這一過程將反復(fù)進行,直到整個數(shù)據(jù)值
   發(fā)送完畢。
   使用 text in row
   在 Microsoft SQL Server 2000 中,用戶可以在表上啟用 text in row 選項,以使該表能夠在其數(shù)據(jù)行中存儲 text、
   ntext 或 image 數(shù)據(jù)。
  
   若要啟用該選項,請執(zhí)行 sp_tableoption 存儲過程,將 text in row 指定為選項名并將 on 指定為選項值。BLOB(二進
   制大對象:text、ntext 或 image 數(shù)據(jù))行中可以存儲的默認最大大小為 256 字節(jié),但是值的范圍可以從 24 到 7000。
   若要指定默認值以外的最大大小,請指定該范圍內(nèi)的整數(shù)作為選項值。
  
   如果應(yīng)用下列條件,則將 text、ntext 或 image 字符串存儲在數(shù)據(jù)行中:
  
   啟用 text in row。
  
  
   字符串的長度比 @OptionValue 所指定的限制短
  
  
   數(shù)據(jù)行中有足夠的可用空間。
   當(dāng) BLOB 字符串存儲在數(shù)據(jù)行中時,讀取和寫入 text、ntext 或 image 字符串可以與讀取或?qū)懭胱址投M制字符串
   一樣快。SQL Server 不必訪問單獨的頁以讀取或?qū)懭?BLOB 字符串。
  
   如果 text、ntext 或 image 字符串比行中所指定的限制或可用空間大,則將指針存儲在該行中。在行中存儲 BLOB 字符
   串的條件仍然適用,但是:數(shù)據(jù)行中必須有足夠的空間容納指針。
  
   有關(guān)更多信息,請參見 sp_tableoption。
  
   使用文本指針
   如果未指定 text in row 選項,text、ntext 或 image 字符串將存儲在數(shù)據(jù)行外;只有這些字符串的文本指針駐留在數(shù)
   據(jù)行中。文本指針指向由內(nèi)部指針生成的樹的根節(jié)點,而這些內(nèi)部指針映射到實際存儲(text、ntext 或 image 數(shù)據(jù)的)
   字符串段的頁。
  
   SQL Server 2000 中的行文本指針與 SQL Server 早期版本中的文本指針不同。行文本指針的行為就象 BLOB 數(shù)據(jù)的文件
   句柄;早期的文本指針功能則象 BLOB 數(shù)據(jù)的地址。因此,在使用行文本指針時,請記住下列特性:
  
  
  
   重要 雖然游標(biāo)中允許有行文本,但卻不允許有行文本指針。如果嘗試聲明包含行文本指針的游標(biāo),SQL Server 將返回錯
   誤信息(8654、16、1、"A cursor plan could not be generated for the given statement because it contains
   textptr(inrow lob)."、1033)。
  
   數(shù)字
   對于每個數(shù)據(jù)庫,每個事務(wù)最多允許 1024 個活動行文本指針。
  
   鎖定
   當(dāng)用戶獲取活動文本指針時,SQL Server 2000 在第一個用戶控制文本指針時鎖定數(shù)據(jù)行,并確保沒有其他用戶修改或刪
   除該行。鎖在文本指針變?yōu)闊o效時被釋放。若要使文本指針無效,請使用 sp_invalidate_textptr。
  
   當(dāng)事務(wù)的隔離級別是未提交讀或者數(shù)據(jù)庫為"只讀"模式時,文本指針不能用于更新 BLOB 值。
  
   當(dāng)數(shù)據(jù)庫為"單用戶"模式時,SQL Server 2000 不鎖定數(shù)據(jù)行。
  
   為舉例說明,給出下面的表:
  
   CREATE TABLE t1 (c1 int, c2 text)
   EXEC sp_tableoption 't1', 'text in row', 'on'
   INSERT t1 VALUES ('1', 'a')
  
   下面的事務(wù)將會成功:
  
   INSERT t1 VALUES ('1','This is text.')
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   GO
   BEGIN TRAN
   DECLARE @ptr varbinary(16)
   SELECT @ptr = textptr(c2)
   FROM t1
   WHERE c1 = 1
   READTEXT t1.c2 @ptr 0 5
   COMMIT TRAN
   GO
  
   下面的事務(wù)將會失。
  
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
   GO
   BEGIN TRAN
   DECLARE @ptr varbinary(16)
   SELECT @ptr = textptr(c2)
   FROM t1
   WHERE c1 = 1
   WRITETEXT t1.c2 @ptr 'xx'
   COMMIT TRAN
   GO
  
   持續(xù)時間
   行文本指針僅在事務(wù)內(nèi)有效。提交事務(wù)時,文本指針變?yōu)闊o效。
  
   在某個事務(wù)內(nèi),當(dāng)發(fā)生下列任一操作時,行文本指針可能無效:
  
   會話結(jié)束。
  
  
   刪除該事務(wù)中的數(shù)據(jù)行。(其它事務(wù)無法刪除數(shù)據(jù)行,因為該行包含鎖。)
  
  
   文本指針?biāo)诘谋淼募軜?gòu)已更改。使文本指針無效的架構(gòu)更改操作包括:創(chuàng)建或除去聚集索引,改變或除去表,截斷表,
   通過 sp_tableoption 更改 text in row 選項,以及執(zhí)行 sp_indexoption。
   使用前面的示例,下列腳本在 SQL Server 早期版本中有效,但在 SQL Server 2000 中將生成錯誤。
  
   DECLARE @ptrval varbinary(16)
   PRINT 'get error here'
   SELECT @ptrval = TEXTPTR(c2)
   FROM t1
   WHERE c1 = 1
   READTEXT t1.c2 @ptrval 0 1
  
   在 SQL Server 2000 中,必須在事務(wù)內(nèi)使用行文本指針:
  
   BEGIN TRAN
   DECLARE @ptrval varbinary(16)
   SELECT @ptrval = TEXTPTR(c2)
   FROM t1
   WHERE c1 = 1
   READTEXT t1.c2 @ptrval 0 1
   COMMIT
  
   NULL 文本
   可以在由 INSERT 生成的 NULL 文本上獲得行文本指針。而在以前,只有將 BLOB 更新為 NULL 后才能獲得文本指針。
  
   例如,下列代碼在 SQL Server 7.0 中無效,但在 SQL Server 2000 中有效。
  
   SET TRANSACTION ISOLATION LEVEL READ COMMITTED
   GO
   INSERT INTO t1 VALUES (4, NULL)
   BEGIN TRAN
   DECLARE @ptrval VARBINARY(16)
   SELECT @ptrval = TEXTPTR(c2)
   FROM t1
   WHERE c1 = 4
   WRITETEXT t1.c2 @ptrval 'x4'
   COMMIT
  
   在 SQL Server 7.0 中,必須執(zhí)行下列操作:
  
   INSERT INTO t1 VALUES (4, NULL)
   UPDATE t1
   SET c2 = NULL
   WHERE c1 = 4
   DECLARE @ptrval VARBINARY(16)
   SELECT @ptrval = TEXTPTR(c2)
   FROM t1
   WHERE c1 = 4
   WRITETEXT t1.c2 @ptrval 'x4'
  
   下表匯總差別。
  
   差別 行文本指針 非行文本指針
   數(shù)字 對于每個數(shù)據(jù)庫,每個事務(wù)最多允許 1024 個活動行文本指針。 無限制。
   鎖定 將數(shù)據(jù)行一直 S 鎖定到指針變?yōu)闊o效為止。
   當(dāng)事務(wù)為"未提交讀"或數(shù)據(jù)庫為"單用戶"或"只讀"模式時不獲取鎖。
   不鎖定數(shù)據(jù)行。
   持續(xù)時間 事務(wù)或會話結(jié)束、刪除行或更改表的架構(gòu)時變?yōu)闊o效。 刪除行時變?yōu)闊o效。
   NULL 文本 插入 NULL 文本后可立即獲取。 只有更新后才能獲取。
  
  
   通過數(shù)據(jù)庫 API 使用 ntext、text 和 image 數(shù)據(jù)
   這一部分概述數(shù)據(jù)庫 API 處理 ntext、text 和 image 數(shù)據(jù)的方式:
  
   ADO
   ADO 可以將 ntext、text 或 image 列或參數(shù)映射為 Field 或 Parameter 對象。使用 GetChunk 方法逐塊檢索數(shù)據(jù),使
   用 AppendChunk 方法逐塊寫數(shù)據(jù)。有關(guān)更多信息,請參見管理 Long 數(shù)據(jù)類型。
  
   OLE DB
   OLE DB 使用 ISequentialStream 接口支持 ntext、text 和 image 數(shù)據(jù)類型。ISequentialStream::Read 方法逐塊讀取
   長數(shù)據(jù),ISequentialStream::Write 方法將長數(shù)據(jù)逐塊寫入數(shù)據(jù)庫。有關(guān)更多信息,請參見 BLOB 和 OLE 對象。
  
   ODBC
   ODBC 具有一種稱為"執(zhí)行中的數(shù)據(jù)"的功能,可用于處理長數(shù)據(jù)的 ODBC 數(shù)據(jù)類型:SQL_WLONGVARCHAR (ntext)、
   SQL_LONGVARCHAR (text) 和 SQL_LONGVARBINARY (image)。這些數(shù)據(jù)類型被綁定到某個程序變量上。這樣一來,就可以調(diào)
   用 SQLGetData 逐塊檢索長數(shù)據(jù),調(diào)用 SQLPutData 逐塊發(fā)送長數(shù)據(jù)。有關(guān)更多信息,請參見管理 text 和 image 列。
  
   DB-Library
   DB-Library 應(yīng)用程序也是將 ntext、text 和 image 列綁定到程序變量上。DB-Library 函數(shù) dbtxtptr 用于獲取指向數(shù)
   據(jù)庫中長列出現(xiàn)位置的指針,dbreadtext 則用來逐塊讀取長數(shù)據(jù)。dbwritetext、dbupdatetext 和 dbmoretext 之類的函
   數(shù)用于逐塊寫入長數(shù)據(jù)。
  
  
  
   說明 不支持使用 DB-Library 訪問行文本。



熱門評論
最新評論
發(fā)表評論 查看所有評論(0)
昵稱:
表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)