char、varchar、text、nchar、nvarchar、ntext区别说明及SQL字符串常用操作

快速目录:

 

 

char、varchar、text、nchar、nvarchar、ntext简要说明:

nchar、nvarchar、ntext中的n代表的是National,即国际化, 也就是代表它们所使用的字符编码为Unicode。

char与nchar、varchar与nvarchar、text与ntext之间的差别都是一样的, 都是加了n就代表使用Unicode编码, 当使用Unicode编码时, 所有的字符都占用两个字节,而没有加n前缀的类型, 对于英文字符和英文字符, 只会占用一个字节, 而对于其他字符(比如中文、日语等), 会占用两个字节。

当有如下表定义:

create table table_1
(
    id int identity(1, 1) primary key,
    name char(5) not null,
    addresses nchar(5) not null
)

table_1中name字段定义为char类型, 而addresses定义为nchar类型, 长度同样为5。

这两个定义的意义为: 字段name可以存储5个英文字符或英文符号, 字段addresses可以存储5个Unicode字符。

对于字段addresses可以简单的理解为:该字段可以存放5个任意字符, 占有10个字节(对于Unicode编码, 每个字符都占有两个字节)。

而对于字段name可以简单理解为:该字段可以存放5个字节的内容, 每个英文字符和符号占一个字节, 其他字符(比如中文、日语等)占两个字节。

 

上面说明了有n前缀和无n前缀的类型区别, 现在只需要说明char、varchar和text的区别即可了

对于char类型, SQL Server会为其预留出指定的空间, 不论其内容实际为多少, 它所占的空间都是固定的,而对于varchar类型, SQL Server会按保存的实际长度来分配空间(外加两个额外的字节空间, 以保存数据的偏移值)。  当然, 以上两种类型的定义中, 内容所占的空间都是不允许超过定义的空间的。

有如下表定义:

create table table_2
(
    id int identity(1, 1) primary key,
    name char(10) not null,
    addresses varchar(20) not null
)

若执行语句:insert into table_2 values('mine', 'here');

虽然'mine'只有四个字节的长度, 但它实际所占的空间还是name字段定义的10个字节空间;而addresses的类型为varchar所以其实际所占空间为4个字节。

char与varchar进行对比, 它们的优缺点在于:

  • char优点:占用空间固定,在对其进行更新操作时, 不需要分配空间和移动数据, 执行速度相对较快。
  • char缺点:占用空间固定,可能会浪费空间, 而且在进行读取操作时, 也因此导致读取速度相对较慢。
  • varchar优点:占用空间随实际内容变化, 不会浪费存储空间, 在进行读取操作时, 因为不用读取多余的无内容字节空间, 所以速度相对较快。
  • varchar缺点:所占空间刚好是内容所占的空间, 所以在对其进行更新操作时, 会需要扩展空间, 会需要移动数据, 这样会使更新操作的速度相对较慢。

 

对于text类型, 由于char和nchar都有长度或空间限制(char最大长度为8000,nchar最大长度为4000), 而有些内容可能远远超出这个长度, 所以需要以另一种类型来进行存储, 也就是text(最大可存储2GB的内容)。

 

字符串常用操作:

简易导航:

01.substring(string, start, length)

  其含义为:从string的第start个字符开始, 取length个字符

  eg:print substring('I miss you', 3, 4);

  输出结果:miss

 

02.left(string, length)

  其含义为:从string的左边开始,取length个字符

  eg:print left('miss you', 4);

  输出结果:miss

 

03.right(string, length)

  其含义为:从string的右边开始,取length个字符

  eg:print right('miss you', 3);

  输出结果:you

 

04.len(string)

  其含义为:计算string的长度(忽略字符串尾部的全部空格)

  eg:print len('miss 你');

  输出结果:6

 

05.datalength(string)

  其含义为:计算string所占的字节数

  eg:print datalength('miss 你');

  输出结果:7

 

06.charindex(substring, string[,start_pos])

  其含义为:在string中查找substring,并返回查找到的第一个substring所在的位置,若未找到,则返回零。第三个可选参数start_pos是指从string的第start_pos个字符后开始查找。

  eg_1:print charindex('-!', 'just-!running-!');

  输出结果:5

  eg_2:print charindex('-!', 'just-!running-!', 6);

  输出结果:14

 

07.patindex(pattern, string)

  其含义为:在string中查找能匹配pattern模式的子字符串,并返回其位置, 若未找到匹配子字符串, 则返回0。(pattern与like后的匹配字符串相同)

  eg:print patindex('%o%', 'waiting for you');

  输出结果:10

 

08.replace(string, substring1, substring2)

  其含义为:将string中的substring1全部替换为substring。

  eg:print replace('十是十四是四', '是', '十');

  输出结果:十十十四十四

 

09.replicate(string, n)

  其含义为:将string复制n次

  eg:print replicate('yo', 3);

  输出结果:yoyoyo

 

10.stuff(string, pos, delete_len, insert_str)

  其含义为:从string的pos位置开始, 删除delete_len个字符, 然后在此位置插入insert_str

  eg:print stuff('wow', 2, 1, 'mom');

  输出结果:wmomw

 

11.upper(string)

  其含义为:将string全部转换为大写(对非英文字母的字符无效)

  eg:print upper('你是Shui');

  输出结果:你是SHUI

 

12.lower(string)

  其含义为:将string全部转换为小写(对非英文字母的字符无效)

  eg:print lower('你是sHUI');

  输出结果:你是shui

 

13.rtrim(string)

  其含义为:去除string右边的空格符(r代表right)

  eg:print rtrim('   rtrim   ')

  输出结果:'   rtrim'

  (实际输出结果中没有两个单引号, 这里的单引号是为了能够看到结果中的空格符)

 

14.ltrim(string)

  其含义为:去除string左边的空格符(l代表left)

  eg:print ltrim('   ltrim   ')

  输出结果:'ltrim   '

  (实际输出结果中没有两个单引号, 这里的单引号是为了能够看到结果中的空格符)

posted @ 2013-10-04 17:40  hourglasser  阅读(597)  评论(0编辑  收藏  举报