1、数据类型
(1)sqlServer 支持两种字符数据类型-常规和unicode
(2)常规包括char 和 varchar 、unicode包括nchar和nvarchar
(3) 常规字符的每个字符使用1个字节存储、unicode要求2个字节
(4) 使用常规只能限制英文,unicode支持中文
(5)两种字符数据类型的文本表示方式不同,常规字节使用单引号、如‘abc’ ,在表示unicode时,需要指定字符N(即 National)作为前缀,N'abc'
(6) 没有var元素的任何数据类型(char ,nchar)具有固定长度,即sql server 按照定义的大小保留行空间,而不是按字符串时间字符数保留空间
(7)char(25)表示sqlserver 在改行保留25个字符空间、不管存储字符串的长度是多少
(8)当固定长度设置过大时,存储开销大,不是最佳方案、使用var元素的数据类型具有可变长度,即sqlserver 根据存储需要在行中使用尽可能多的存储空间存储字符串,同时外加两个额外的字节偏移数据
(9)varchar(25)支持的最大字符数时25,但实际上按照字符串中实际字符数确定存储,这样设置存储消耗会小于固定长度,读取速度更快
(10)使用可变长度,当更新数据时可能会导致行拓展、这可能导致数据移动到当前page之外,因此可变长度的数据更新效率低于固定长度数据类型
(11)可以使用MAX 说明符定义可变长度数据类型,而不是最大字符数,当使用了MAX说明符后,阀值内的直接存储、超过了会自动作为大型对象(LOB)存储在行的外部
2、排序规则
(1)排序规则是一个字符数据属性,封装多项内容,包括语言支持、排序规则、区分大小写、区分重音等
(2)查询数据库所支持的所有字符集
select * from SYS.fn_helpcollations();
(3) 对Latin1_General_CI_AS 说明
Latin1_General :语言支持、支持英语、德语字符
排序规则: 由于没有限制定义排序规则、默认使用字典排序(自然排序规则)、如果出现了BIN意味着使用二进制排序
CI 表示不区分大小写(a=A)
AS表示区分重音
(4)在企业内部部署的sqlserver 实施中,排序规则定义在4个不同层次,实例,数据库 ,列,表达式,在Azure Sql中排序规则在数据库、列、表达式,注意不支持实例实例级别上指定
3、字符串操作函数
3.1字符串连接
(1)T-sql 提供了(+) 和 concat函数连接字符串,其中concat是sql server2012提供的
select firstname+N' '+lastname as fullname form HR.Employees;
(2)标准sql规定了连接NULL 的结果为NULL ,这也是Sql Server 的默认行为,因此在做字符串拼接的时候要考虑将NULL 看做空串对待,解决方案是使用coalesce函数,此函数接收一个输入值返回一个非null输出值
-- 若region 为NULL,N''+region为NULL,coalesce函数会将其替换成N'' select coalesce(N''+region,N' ') from Sales.Customers
(3)sql server 2012 引入了一个名为concat的新函数,接收一个要连接的输入字符列表,自动将NULL 替换成空串
select concat(firstname,N' ' ,lastname) as fullname from HR.Employees
3.2 字符串截取
(1)substring(str,start,length) ,substring('abcde',1,3) 返回abc 、 如果第三个参数超过输入字符串的末尾,并不会引发错误,函数将会返回一个直到末尾的所有字符串
(2)left 和 right 是substring 的简化形式,left(str,n) 、 right(str,n) , left('abcde',3) 返回‘abc’
3.3字符串字符长度
(1)len(str) , len(N'abcde'),返回5
(2)注意len 是返回字符数,跟字符类型没有关系,如果想返回字节数 datalength(N'abcde') 返回10
(3)len 会将首尾空格删掉,datalength 不会
3.4 返回子字符串第一次出现的位置
(1)charindex(substr,str) ,位置从1开始数
(2)如果没有找到返回0
3.5大小写转换
(1)UPPER(str) ,LOWER(str)
3.6 删除前后空格
(1)rtrim 和 ltrim 分别删除首尾空格
(2)rtrim(ltrim(str)) 等于java中的trim