处理字符数据--数据类型

  SQL Server支持两种字符数据类型——普通字符和Unicode字符。普通字符数据类型包括CHAR和VARCHAR,Unicode字符数据类型包括NCHAR和NVARCHAR。它们二者的区别是:普通字符使用一个字节(byte)来保存每个字符,而Unicode字符则需要两个字节。当使用普通字符类型时,由于一个列只用一个字节来保存每个字符,所以就限制在这个列中只能使用英语这一语言,因为一个字节只能代表256(2^8)个不同的字符。一个列所支持的语言是由列的有效排序规则(collation)属性决定的。当使用Unicode数据类型时,一个列可以代表65535(2^16)个不同的字符,因为这时用两个字节来保存每个字符。所有语言都可以用相同的Unicode码来表示,这样,当某个列使用了Unicode数据类型时,就可以在这个列中混合多种语言,而不必只局限于英语。

  在字符常量的表示方式上,这两种字符数据类型也有所不同。当表示一个普通的字符常量时,值需要简单地使用单引号:'This is a regular character string literal'。当表示一个Unicode类型的字符常量时,需要在前面指定一个字符N(代表National)作为前缀:N'This is a Unicode character string literal'。

  名称中不包含VAR元素的任何数据类型都是固定长度的(CHAR,NCHAR),对于这样的类型,SQL Server会按照为列定义的大小,在行中为该列预留出固定的空间,所以该列的长度并不是字符串中字符的实际个数。例如,如果将一个列定义为CHAR(25),SQL Server就会在行中为这个列预留出25个字符的空间,而不考虑其中保存的字符串的实际长度。因为当需要扩展字符串时,在行中无法进行扩展,所以固定长度的数据类型更适合于以写入为主的(write-focused)系统。但因为这种类型的存储消耗不是最优的,所以在读取数据时可能要付出更多的代价。

  名称中含有VAR元素的数据类型是可变长度的(VARCHAR,NVARCHAR),SQL Server在行中会按字符串的实际长度来保存数据,外加两个额外的字节以保存数据的偏移值(offset data)。例如,如果将一个列定义为VARCHAR(25),就意味着它应该最多支持25个字符,在实际使用中,存储空间有字符串中字符的实际数量来决定。与固定长度类型相比,可变长度类型消耗的存储空间更少,所以读取操作也会更快。不过,更新数据时可能需要对行进行扩展,导致数据移动,超出当前页的范围。因此,与固定长度的数据类型相比,对具有可变长度数据类型的数据进行更新的效率会有所降低。

  在定义可变长度的数据类型时,可以使用MAX说明符,而不必指定字符的最大数量。当用MAX说明符来定义一个列时,可以把一个值直接保存到行的内部,其长度具有一定的上限(默认是8000字节)。大小超过该上限的值将作为大型对象(LOB,large object),保存在行的外部。

posted @ 2012-09-25 10:43  沙耶  阅读(260)  评论(0编辑  收藏  举报