【发布时间】:2017-08-22 03:39:21
【问题描述】:
对于没有依赖于排序规则的明确顺序的字符(即,不折叠大小写和/或没有去除重音符号),排序基于代码点的序号值基本字符集。如果一个字符串是另一个字符串的前缀,则较短的字符串首先排序。
Unicode 中的前 128 个代码点与 ASCII 字符集相同,这意味着 / 在 - 之后。 ---- 来自 cco 的回答。
那为什么会出现以下情况呢?
我希望 '2017/8/22 1:33:53' 出现在 '2017-08-13 23:12:33.411' 之后,因为 / 出现在 - 之后。这是因为 Chinese_PRC_CI_AS 排序规则中的特殊排序吗?如果是这种情况,我在哪里可以找到规范?
【问题讨论】:
-
您要做的最后一件事是比较包含在字符串中的日期时间。在比较之前将这些字符串转换或转换为
DATETIME类型。更好的是,不要将日期时间存储为字符串。 -
@TT。感谢您的提醒!如果数据库是由我创建的,我当然不会这样做......但无论如何,关于这个问题的任何想法(特别是为什么会发生这种奇怪的比较结果)?谢谢!
-
长度肯定被考虑在内,这不依赖于排序规则。执行以下命令:
DECLARE @t TABLE (v NVARCHAR(3)); INSERT INTO @t(v)VALUES('1'),('01'),('10'),('2'),('3'),('300'),('301'); SELECT*FROM @t ORDER BY v;。您会看到 10 在 2 之前出现。如果字符串的长度可以变化,或者如果使用其他字符作为分隔符,则无法比较字符串中的日期时间。 -
请查看此问题,了解为什么字符串 '2017/8/22 1:33:53' 在 '2017-08-13 23:12:33.411' 之前。没关系,它实际上是日期时间。当我们比较字符串时,前者应该在后者之后,而它不在上图中。
标签: sql-server sql-server-2008 collation sql-server-2016 codepages