--=====================================================
字符集
--====================================================
常用函数:
使用LEN来查看字符串的字符数
SELECT LEN('ABC你好')
-----------------------------------------------------------
使用DATALENGTH来查看字符串的占用空间
SELECT DATALENGTH('ABC你好')
-----------------------------------------------------------
使用CHARINDEX来查看某个字符串在
SELECT CHARINDEX('a','bcabc')
----------------------------------------------------------
使用PATINDEX来匹配字符
SELECT PATINDEX('%[吖-座]%','12你好0')
---------------------------------------------------------
CHARINDEX 和 PATINDEX 函数都返回指定模式的开始位置。
PATINDEX 可使用通配符,而 CHARINDEX 不可以。
--------------------------------------------------------
使用SUBSTRING来截取字符串(字符串的起始位置1)
SELECT SUBSTRING('123',2,1)--结果2
--------------------------------------------------------
使用REPLICATE来复制字符串
SELECT REPLICATE('ABC',2)
-------------------------------------------------------
使用REVERSE来反转字符串
SELECT REVERSE('ABCD123')
-----------------------------------------------------
在LIKE查询时,.匹配单个字符,%匹配任意长度字符,如果要防止转义,可
1> C1 LIKE '%[.]%'
2> C1 LIKE '%.%' ESCAPE '.'
--=======================================================
变长和定长类型的区别:
1>对于VARCHAR 和NVARCHAR列 ,NULL值和空字符串不占用存储空间
2>对于CHAR 和NCHAR列 ,NULL值和字符串与其他非空字符串占用同样的存储空间
3>由于CHAR 和NCHAR数据占用空间固定,可以很快定位到数据,因此在查询时速度较快
4>VARCHAR和NVARCHAR 列需要额外的两个字节来记录列实际长度,查询时需要计算偏移量
5>CHAR和NCHAR 列中数据不够的加空格补上,在各行数据变化较大情况下,可能会造成较多的空间浪费(如使用CHAR(500)来存放平均长度只有10的数据)
6>对于长度较小数据, 可以使用CHAR或 NCHAR来提高性能
7>类型优先级(从高到低)nvarchar(包括 nvarchar(max)) >> nchar >>varchar(包括 varchar(max)) >> char
--=======================================================
unicode和非unicode的区别
这并不是个纠结的问题,而是对与错的问题,如果你的数据列只存放一种语言的数据,且数据列使用的排序规则和存放的数据时同一语言下,那么使用char和varchar来存放没有问题,如果不是一种语言,那么老老实实使用nchar和nvarchar吧。
为什么char和varchar也能存放中文字符?
当数据列使用的排序规则是诸多中文排序规则下一种时,那么中文字符可以被成功地解码存放到数据库中,在读取时被成功解码回中文字符,因此没有乱码情况。但如果该数据列存放阿拉伯字符,就会出现乱码情况。
如:SELECT '你好--hello-- مرحبا ',N'你好--hello-- مرحبا '
字符串在varchar和nvarchar下数据占用情况?
对于varchar类型,英文字符(包含阿拉伯数字)占用一个字节的空间,非英文字符占用两个字节空间(无论是否乱码)
对于nvarchar类型,英文字符和非英文字符都占用两个字节空间
为什么仍有人使用char和varchar来存放含有中文字符的数据?
在数据列只存放一种语言数据情况下,如果该列数据可能包含大量英文字符,那么使用char和varchar可以有效减少数据占用的空间,因此可以在一定程度上减小IO消耗从而提升性能。
PS1: 请注意前提条件。
PS2:如果列中数据大部分是非英文字符或不确定会不会存放其他语言字符的话,还是使用nchar和nvarchar吧
如果你尝试在中文排序规则下测试日文,会发现没有乱码,小伙伴请不要惊讶,因为日文那些字符都能在汉字字典里看到哦!
--=============================================================================
依旧是妹子