sql-server – 选择可以区分Sql Server中nvarchar列的’ss’和’
由于SQL服务器的默认SQL_Latin1_General_CP1_CI_AS排序规则无法区分ss和?,所以我想根据
here的建议将表中特定列的排序规则更改为SQL_Latin1_General_CP437_BIN2.
不过,我不知道这是否是一般的做法.另外我不知道除了以下内容之外的含义: >更改排序顺序:因为我从来没有对这一列的数据进行排序,对我来说可能不是一个问题.但是,如果你另有想法,请让我知道. 我很好奇这个变化的其他主要影响,如果有的话. 此外,我还想知道以下哪一个最适合这种情况:
如果您认为还有其他排序规则更适合这种情况,请提及这些. 19.03.2017更新: >必须检查来自@srutzky和@SqlZim的答案以及相关的引用资源.在这种情况下你不想匆匆忙忙. 玩的开心 :) 解决方法关于排序的几点:>从SQL Server 2000开始,SQL_ Collat??ions已被弃用(是的,2000年).如果你可以避免使用它们,你应该(但是并不意味着如果没有紧迫的需要,就改变一堆事情!). SQL_ Collat??ions的问题实际上仅与VARCHAR(即非Unicode)数据相关,因为NVARCHAR(即Unicode)数据使用来自操作系统的规则.但是,对于VARCHAR数据的排序和比较的规则,不幸的是使用简单的映射,并不包括更复杂的语言规则.这就是为什么ss和?在使用相同的SQL_Latin1_General_CP1_CI_AS排序规则存储为VARCHAR时不等同.这些不推荐的排序方式在单词中间使用时也不能给予较低的重音.非SQL_ Collat??ions(即Windows Collat??ions)对VARCHAR和NVARCHAR使用相同的规则,因此VARCHAR处理更加强大,与NVARCHAR更一致. _BIN Collat??ions的问题相当微妙,因为它只影响排序. _BIN和_BIN2之间的比较是相同的,因为它们在字节级别进行比较(因此没有语言规则).但是,由于SQL Server(和Windows / PC)是Little Endian,实体按照反向字节顺序存储.当处理双字节“字符”时,这显然是NVARCHAR数据:UTF-16 Little Endian.这意味着Unicode码点U1216在大端系统上具有0x1216的十六进制/二进制表示形式,但在小端系统上存储为0x1612.要完整的圆圈,以便这个最后一点的重要性(希望)变得明显:_BIN Collat??ions将逐字节(第一个字符之后)进行比较,因此将U1216视为0x16,然后将0x12视为0x12,而_BIN2 Collat??ions将通过代码点比较代码点,因此将U1216视为0x12,然后将0x16. 使用以下查询来查看排序是非二进制的,不等于这些字符: DECLARE @SQL NVARCHAR(MAX) = N'DECLARE @Counter INT = 1;'; SELECT @SQL += REPLACE(N' IF(N''?'' COLLATE {Name} = N''ss'' COLLATE {Name}) BEGIN RAISERROR(N''%4d. {Name}'',10,1,@Counter) WITH NOWAIT; SET @Counter += 1; END; ',N'{Name}',col.[name]) + NCHAR(13) + NCHAR(10) FROM sys.fn_helpcollations() col WHERE col.[name] NOT LIKE N'SQL[_]%' AND col.[name] NOT LIKE N'%[_]BIN%' ORDER BY col.[name] --PRINT @SQL; EXEC (@SQL); 所以: >如果要使用二进制排序规则,请使用类似Latin1_General_100_BIN2的内容. >索引 提示:确保检查列的当前NULL / NOT NULL设置,并在ALTER TABLE … ALTER COLUMN …语句中指定它,以便不会更改.>如果只有一些查询需要这个不同的行为,那么在每个条件的基础上(例如WHERE选项卡),只用COLLATE子句覆盖这些比较操作.[ThisColumn] LIKE N’%ss%’COLLATE Latin1_General_100_BIN2). COLLATE关键字只应在运算符的一侧(因为排序规则优先级将应用于另一方)需要. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |