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)
- 02.-->left(string, length)
- 03.-->right(string, length)
- 04.-->len(string)
- 05.-->datalength(string)
- 06.-->charindex(substring, string[,start_pos])
- 07.-->patindex(pattern, string)
- 08.-->replace(string, substring1, substring2)
- 09.-->replicate(string, n)
- 10.-->stuff(string, pos, delete_len, insert_str)
- 11.-->upper(string)
- 12.-->lower(string)
- 13.-->rtrim(string)
- 14.-->ltrim(string)
01.substring(string, start, length)
其含义为:从string的第start个字符开始, 取length个字符
eg:print substring('I miss you', 3, 4);
输出结果:miss
其含义为:从string的左边开始,取length个字符
eg:print left('miss you', 4);
输出结果:miss
其含义为:从string的右边开始,取length个字符
eg:print right('miss you', 3);
输出结果:you
其含义为:计算string的长度(忽略字符串尾部的全部空格)
eg:print len('miss 你');
输出结果:6
其含义为:计算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
其含义为:在string中查找能匹配pattern模式的子字符串,并返回其位置, 若未找到匹配子字符串, 则返回0。(pattern与like后的匹配字符串相同)
eg:print patindex('%o%', 'waiting for you');
输出结果:10
08.replace(string, substring1, substring2)
其含义为:将string中的substring1全部替换为substring。
eg:print replace('十是十四是四', '是', '十');
输出结果:十十十四十四
其含义为:将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
其含义为:将string全部转换为大写(对非英文字母的字符无效)
eg:print upper('你是Shui');
输出结果:你是SHUI
其含义为:将string全部转换为小写(对非英文字母的字符无效)
eg:print lower('你是sHUI');
输出结果:你是shui
其含义为:去除string右边的空格符(r代表right)
eg:print rtrim(' rtrim ')
输出结果:' rtrim'
(实际输出结果中没有两个单引号, 这里的单引号是为了能够看到结果中的空格符)
其含义为:去除string左边的空格符(l代表left)
eg:print ltrim(' ltrim ')
输出结果:'ltrim '
(实际输出结果中没有两个单引号, 这里的单引号是为了能够看到结果中的空格符)