SQL Server ntext、text 和 image

请参阅:

请参阅:

在 MicrosoftSQL Server 的未来版本中将删除 ntext、text 和 image
数据类型。请避免在新开发工作中使用这些数据类型,并考虑修改当前使用这些数据类型的应用程序。请改用
nvarchar(max)、varchar(max) 和 varbinary(max)。

  • text in row(1)
  • text in
    row(2)
  • text in
    row(3)
  • text in
    row(1)
  • text in row(2)
  • text in
    row(3)

用于存储大型非 Unicode 字符、Unicode
字符及二进制数据的固定长度数据类型和可变长度数据类型。Unicode 数据使用
UNICODE UCS-2 字符集。

默认情况下,text、ntext、image 字符串存储在数据行外的大型(最大
2GB)字符串或二进制字符串,而数据行存储的是 16
字节的文本指针,该指针指向一个树的根结点,而这个树存储的是实际字符串或二进制字符串所在页的指针。

text in row 可以指定多少字节以下的字符串存在在行中,如果 text、ntext
或 image字符串长度比 text in row
指定的长度短,且数据行中有足够的可用空间容纳字符串
,那么字符串存在在行内部,而不是存在在行外部。

一个实际工作中的例子:

我们知道 SQL Server 中页的大小为
8KB,除去相关占用,一页的数据大小最大还不足
8KB,由于一条记录(一行数据)只能存储在一页中,所以一条记录的最大大小不可能超过
8KB,而 8KB 对于很多记录来说是不够的,比如新闻系统,于是就产生了
text、ntext、image
字段,将实际的字符串存储在行外部,而行内部只存储相关的指针,这就是为什么
text、ntext、image 类型的字段,一般不能用字符串函数的原因了。

存储在数据行中的字符串,读写速度快,且可像 varchar
一样使用某些字符串函数。

1 DECLARE @ptrval varbinary(16)2 SELECT @ptrval = TEXTPTR(f006l_0046)
3 FROM TB_澳门新葡萄京官网注册 ,TEXT_0046 where ob_textid_0046=’36239710’4 READTEXT
TB_TEXT_0046.f006l_0046 @ptrval 0 32955 GO

说了这么多,我们也该引入 text in row
了,一个新闻系统,有的文章很长,有的文章很短,只有几十个字,完全可以存储在行中,而不用存储在行外部,text
in row 就是在这种情况下提出的。

如果 text、ntext 或 image字符串长度比 text in row
指定的长度长,或数据行中没有足够的空间容纳字符串
,那么数据行存储指针集。这与
text in row 关闭时存储的指针有区别,text in row
关闭时存储的是某个树的根结点指针,而这里存储的是某个树根结点下面(树内部)的指针,这样由于不需要先访问根结点,处理速度也要稍显快些。

在查询分析器,或者企业管理器中我们看这些类型的数据时,通常情况下是看不到或者看到不完的数据的。实际在T-SQL中具有一个ReadText函数可以完成此工作,若不知道要当前列的长度时,一个很傻的办法是可以设定一个很大的,然后,执行之,将出现错误提示,在错误提示中可以看到最大值。

不过行中最多可容纳 5 个内部指针,需要 72 个字节的空间,如果连 72
个字节的空间都没有,并且又需要 5 个指针,SQL Server 就会另外分配一个 8KB
的页来容纳它们,所以 text in row 的值不应小于 72
字节,但也不应过高,如果此值过高,那么一个数据页可能容纳不了几条记录,就造成过多的页访问,速度反而变慢。

以下这些文字摘自Ms SQL2000的联机丛书。

READTEXT读取 text、ntext 或 image 列中的 text、ntext 或 image
值,从指定的偏移量开始读取指定的字节数。

语法READTEXT { table.column text_ptr offset size } [ HOLDLOCK ]

参数table.column

是从中读取的表和列的名称。表名和列名必须符合标识符的规则。必须指定表名和列名,不过可以选择是否指定数据库教程名称和所有者名称。

text_ptr

有效文本指针。text_ptr 必须是 binary(16)。

offset

开始读取 text、image 或 ntext 数据之前跳过的字节数或字符数。使用 ntext
数据类型时,offset 是在开始读取数据前跳过的字符数。使用 text 或 image
数据类型时,offset 是在开始读取数据前跳过的字节数。

size

是要读取数据的字节数或字符数。如果 size 是 0,则表示读取了 4 KB
字节的数据。

HOLDLOCK

使文本值一直锁定到事务结束。其他用户可以读取该值,但是不能对其进行修改。

注释使用 TEXTPTR 函数获得有效的 text_ptr 值。如果返回不止一行,TEXTPTR
将返回指向指定行中的 text、ntext 或 image
列的指针,或返回指向查询所返回的最后一行中的 text、ntext 或 image
列的指针。由于 TEXTPTR 返回 16
字节的二进制字符串,所以最好声明一个控制文本指针的局部变量,然后在
READTEXT 中使用该变量。有关声明局部变量的更多信息,请参见
@MSITStore:C:Program%20FilesMicrosoft%20SQL%20Server80ToolsBookstsqlref.chm::/ts_de-dz_66w5.htm。

在 SQL Server 2000 中可能存在无效的文本指针。有关 text in row
选项的更多信息,请参见
sp_tableoption。有关如何使文本指针无效的更多信息,请参见
sp_invalidate_textptr。

如果 @@TEXTSIZE 函数的值小于为 READTEXT 指定的大小,它将替代为 READTEXT
指定的大小。@@TEXTSIZE 函数是对由 SET TEXTSIZE
语句设置的返回数据字节数的限制。有关如何设置 TEXTSIZE
会话设置的更多信息,请参见 SET TEXTSIZE。

权限READTEXT 权限默认授予对指定的表具有 SELECT
权限的用户。这些权限可在传递 SELECT 权限时传递。

示例下例读取 pub_info 表中 pr_info 列的第 2 个至第 26 个字符。

USE pubsGODECLARE @ptrval varbinary(16)SELECT @ptrval =
TEXTPTR(pr_info)FROM pub_info pr INNER JOIN publishers pON
pr.pub_id = p.pub_idAND p.pub_name = ‘New Moon Books’READTEXT
pub_info.pr_info @ptrval 1 25GO

ntext长度可变的 Unicode 数据,最大长度为 2^30 – 1 (1,073,741,823)
个字符。存储大小是所输入字符个数的两倍。ntext 的 ISO 同义词为 national
text。

text服务器代码页中长度可变的非 Unicode 数据,最大长度为 2^31-1
(2,147,483,647) 个字符。当服务器代码页使用双字节字符时,存储仍是
2,147,483,647 字节。根据字符串,存储大小可能小于 2,147,483,647 字节。

image长度可变的二进制数据,从 0 到 2^31-1 (2,147,483,647) 个字节。

注释——————————————————————————–

以下函数和语句可与 ntext、text 或 image 数据一起使用。

发表评论

电子邮件地址不会被公开。 必填项已用*标注