ntext和text同樣用來保存大量的文字數據,不過text用單字節保存數據 ,ntext固定用雙字節保存數據. ntext保存的是Uncode的字符 , ntext支持跨語言平臺。
ntext:
可變長度 Unicode 數據的最大長度爲 230 - 1 (1,073,741,823) 個字符。存儲大小是所輸入字符個數的兩倍(以字節爲單位)。ntext 在 SQL-92 中的同義詞是 national text。
ntext中存數據是按雙字節存的 ,顯示不了NTEXT你換一下recordset打開方式就好了
text:
服務器代碼頁中的可變長度非 Unicode 數據的最大長度爲 231-1 (2,147,483,647) 個字符。當服務器代碼頁使用雙字節字符時,存儲量還是 2,147,483,647 字節。存儲大小可能小於 2,147,483,647 字節(取決於字符串)。 數據庫
char、varchar、text和nchar、nvarchar、ntext的區別服務器
一、CHAR。CHAR存儲定長數據很方便,CHAR字段上的索引效率級高,好比定義char(10),那麼不論你存儲的數據是否達到了10個字節,都要佔去10個字節的空間,不足的自動用空格填充。
二、VARCHAR。存儲變長數據,但存儲效率沒有CHAR高。若是一個字段可能的值是不固定長度的,咱們只知道它不可能超過10個字符,把它定義爲 VARCHAR(10)是最合算的。VARCHAR類型的實際長度是它的值的實際長度+1。爲何「+1」呢?這一個字節用於保存實際使用了多大的長度。從空間上考慮,用varchar合適;從效率上考慮,用char合適,關鍵是根據實際狀況找到權衡點。
三、TEXT。text存儲可變長度的非Unicode數據,最大長度爲2^31-1(2,147,483,647)個字符。
四、NCHAR、NVARCHAR、NTEXT。這三種從名字上看比前面三種多了個「N」。它表示存儲的是Unicode數據類型的字符。咱們知道字符中,英文字符只須要一個字節存儲就足夠了,但漢字衆多,須要兩個字節存儲,英文與漢字同時存在時容易形成混亂,Unicode字符集就是爲了解決字符集這種不兼容的問題而產生的,它全部的字符都用兩個字節表示,即英文字符也是用兩個字節表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較起來,nchar、nvarchar則最多存儲4000個字符,不管是英文仍是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。能夠看出使用nchar、nvarchar數據類型時不用擔憂輸入的字符是英文仍是漢字,較爲方便,但在存儲英文時數量上有些損失。
對於何時用varchar和nvarchar沒有說必定的.
也就是說一個漢字既能夠存在varchar中,也能夠存在nvarchar中.
那麼對於漢字或者Unicode 數據到底存在varchar和nvarchar有什麼區別呢?
下面例子說明一下:一個漢字佔varchar(2),只佔nvarchar(1),而字母只佔varchar(1),那麼在數據庫字段求長度的時候,用varchar你就不必定知道它確切的知道它到底有幾個字,若是用nvarchar,那麼漢字也是nvarchar(1),字母也是nvarchar(1),那麼已經很明顯了.
區別2:varchar的檢索快於nvarchar,雖然是這樣但微軟下一個版本將統一nvarchar,據說的架構
管理 ntext、text 和 image 數據
函數
Microsoft® SQL Server™ 的 ntext、text 和 image 數據類型在單個值中能夠包含很是大的數據量(最大可
達 2 GB)。單個數據值一般比應用程序在一個步驟中可以檢索的大;某些值可能還會大於客戶端的可用虛擬內存。所以,
在檢索這些值時,一般須要一些特殊的步驟。
若是 ntext、text 和 image 數據值不超過 Unicode 串、字符串或二進制串的長度(分別爲 4,000 個字符、8,000 個字
符和 8,000 個字節),就能夠在 SELECT、UPDATE 和 INSERT 語句中引用它們,其引用方式與較小的數據類型相同。例
如,包含短值的 ntext 列能夠在 SELECT 語句的選擇列表中引用,這與 nvarchar 列的引用方式相同。引用時必須遵照一
些限制,例如不能在 WHERE 子句中直接引用 ntext、text 或 image 列。這些列能夠做爲返回其它數據類型(例如
ISNULL、SUBSTRING 或 PATINDEX)的某個函數的參數包含在 WHERE 子句中,也能夠包含在 IS NULL、IS NOT NULL 或
LIKE 表達式中。
處理較大的數據值
可是,若是 ntext、text 和 image 數據值較大,則必須逐塊處理。Transact-SQL 和數據庫 API 均包含使應用程序能夠
逐塊處理 ntext、text 和 image 數據的函數。
數據庫 API 按照一種通用的模式處理長 ntext、text 和 image 列:
若要讀取一個長列,應用程序只需在選擇列表中包含 ntext、text 或 image 列,並將該列綁定到一個程序變量,該變量
應足以容納適當的數據塊。而後,應用程序就能夠執行該語句,並使用 API 函數或方法將數據逐塊檢索到綁定的變量中。
若要寫入一個長列,應用程序可以使用參數標記 (?) 在相應位置代替 ntext、text 或 image 列中的值,以執行 INSERT
或 UPDATE 語句。參數標記(對 ADO 而言則爲參數)被綁定到一個足以容納數據塊的程序變量上。應用程序進入循環,在
循環中先將下一組數據移到綁定的變量中,而後調用 API 函數或方法寫入數據塊。這一過程將反覆進行,直到整個數據值
發送完畢。
使用 text in row
在 Microsoft SQL Server 2000 中,用戶能夠在表上啓用 text in row 選項,以使該表可以在其數據行中存儲 text、
ntext 或 image 數據。
若要啓用該選項,請執行 sp_tableoption 存儲過程,將 text in row 指定爲選項名並將 on 指定爲選項值。BLOB(二進
制大對象:text、ntext 或 image 數據)行中能夠存儲的默認最大大小爲 256 字節,可是值的範圍能夠從 24 到 7000。
若要指定默認值之外的最大大小,請指定該範圍內的整數做爲選項值。
若是應用下列條件,則將 text、ntext 或 image 字符串存儲在數據行中:
啓用 text in row。
字符串的長度比 @OptionValue 所指定的限制短
數據行中有足夠的可用空間。
當 BLOB 字符串存儲在數據行中時,讀取和寫入 text、ntext 或 image 字符串能夠與讀取或寫入字符串和二進制字符串
同樣快。SQL Server 沒必要訪問單獨的頁以讀取或寫入 BLOB 字符串。
若是 text、ntext 或 image 字符串比行中所指定的限制或可用空間大,則將指針存儲在該行中。在行中存儲 BLOB 字符
串的條件仍然適用,可是:數據行中必須有足夠的空間容納指針。
有關更多信息,請參見 sp_tableoption。
使用文本指針
若是未指定 text in row 選項,text、ntext 或 image 字符串將存儲在數據行外;只有這些字符串的文本指針駐留在數
據行中。文本指針指向由內部指針生成的樹的根節點,而這些內部指針映射到實際存儲(text、ntext 或 image 數據的)
字符串段的頁。
SQL Server 2000 中的行文本指針與 SQL Server 早期版本中的文本指針不一樣。行文本指針的行爲就象 BLOB 數據的文件
句柄;早期的文本指針功能則象 BLOB 數據的地址。所以,在使用行文本指針時,請記住下列特性:
重要 雖然遊標中容許有行文本,但卻不容許有行文本指針。若是嘗試聲明包含行文本指針的遊標,SQL Server 將返回錯
誤信息(865四、1六、一、"A cursor plan could not be generated for the given statement because it contains
textptr(inrow lob)."、1033)。
數字
對於每一個數據庫,每一個事務最多容許 1024 個活動行文本指針。
鎖定
當用戶獲取活動文本指針時,SQL Server 2000 在第一個用戶控制文本指針時鎖定數據行,並確保沒有其餘用戶修改或刪
除該行。鎖在文本指針變爲無效時被釋放。若要使文本指針無效,請使用 sp_invalidate_textptr。
當事務的隔離級別是未提交讀或者數據庫爲"只讀"模式時,文本指針不能用於更新 BLOB 值。
當數據庫爲"單用戶"模式時,SQL Server 2000 不鎖定數據行。
爲舉例說明,給出下面的表:
CREATE TABLE t1 (c1 int, c2 text)
EXEC sp_tableoption 't1', 'text in row', 'on'
INSERT t1 VALUES ('1', 'a')
下面的事務將會成功:
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
下面的事務將會失敗:
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
持續時間
行文本指針僅在事務內有效。提交事務時,文本指針變爲無效。
在某個事務內,當發生下列任一操做時,行文本指針可能無效:
會話結束。
刪除該事務中的數據行。(其它事務沒法刪除數據行,由於該行包含鎖。)
文本指針所在的表的架構已更改。使文本指針無效的架構更改操做包括:建立或除去彙集索引,改變或除去表,截斷表,
經過 sp_tableoption 更改 text in row 選項,以及執行 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 中,必須在事務內使用行文本指針:
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 中,必須執行下列操做:
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'
下表彙總差異。
差異 行文本指針 非行文本指針
數字 對於每一個數據庫,每一個事務最多容許 1024 個活動行文本指針。 無限制。
鎖定 將數據行一直 S 鎖定到指針變爲無效爲止。
當事務爲"未提交讀"或數據庫爲"單用戶"或"只讀"模式時不獲取鎖。
不鎖定數據行。
持續時間 事務或會話結束、刪除行或更改表的架構時變爲無效。 刪除行時變爲無效。
NULL 文本 插入 NULL 文本後可當即獲取。 只有更新後才能獲取。
經過數據庫 API 使用 ntext、text 和 image 數據
這一部分概述數據庫 API 處理 ntext、text 和 image 數據的方式:
ADO
ADO 能夠將 ntext、text 或 image 列或參數映射爲 Field 或 Parameter 對象。使用 GetChunk 方法逐塊檢索數據,使
用 AppendChunk 方法逐塊寫數據。有關更多信息,請參見管理 Long 數據類型。
OLE DB
OLE DB 使用 ISequentialStream 接口支持 ntext、text 和 image 數據類型。ISequentialStream::Read 方法逐塊讀取
長數據,ISequentialStream::Write 方法將長數據逐塊寫入數據庫。有關更多信息,請參見 BLOB 和 OLE 對象。
ODBC
ODBC 具備一種稱爲"執行中的數據"的功能,可用於處理長數據的 ODBC 數據類型:SQL_WLONGVARCHAR (ntext)、
SQL_LONGVARCHAR (text) 和 SQL_LONGVARBINARY (image)。這些數據類型被綁定到某個程序變量上。這樣一來,就能夠調
用 SQLGetData 逐塊檢索長數據,調用 SQLPutData 逐塊發送長數據。有關更多信息,請參見管理 text 和 image 列。
DB-Library
DB-Library 應用程序也是將 ntext、text 和 image 列綁定到程序變量上。DB-Library 函數 dbtxtptr 用於獲取指向數
據庫中長列出現位置的指針,dbreadtext 則用來逐塊讀取長數據。dbwritetext、dbupdatetext 和 dbmoretext 之類的函
數用於逐塊寫入長數據。
說明 不支持使用 DB-Library 訪問行文本。指針