1

varchar在 MySQL 数据库中有一个列,它存储一些可以包含任何字符和数字的文本。

架构utf8用作字符集和utf8_unicode_ci排序规则。InnoDB用作数据库引擎,因为我需要使用事务。

我想做的是能够以ORDER BY自然的方式访问该列。例如,这里有一些示例数据:

12234 some random text
my text 23
mytext3
123456abcd
text23
text1
text111
text33

将测试数据插入测试表后,我运行查询和ORDER BY列:varcharASC

SELECT * FROM `test` WHERE 1 ORDER BY data ASC;

问题是没有考虑数字的“大小”:

12234 some random text
123456abcd
my text 23
mytext3
text1
text111 <-------
text23
text33

然后我在这里找到了这个问题,它提供了一个(几乎)解决方案:

SELECT * FROM `test` WHERE 1 ORDER BY data * 1 DESC;

123456abcd             <------ These 2 should
12234 some random text <------ be swapped
my text 23
mytext3
text23
text1
text33
text111

上面的另一个缺点是上面不能使用任何索引,因为每一行都有一个操作。

我也不确定引入非拉丁字符后会产生什么效果。

有没有一种高效的方法让 MySQL 执行自然语言排序?

4

1 回答 1

0

您问:

   Is there a performant way to get MySQL to perform natural language sorting?

简短的回答:没有。

更长的答案:

大概您希望 MySQL 以使用所选排序规则和数字文本处理非数字文本的方式来整理您的日期,就好像它是二进制数一样。

您将需要创建某种用于整理的代理键,并将其存储在自己的列中。您可以通过像这样转换每个文本字符串来做到这一点,并将原始字符串和代理键字符串都加载到 dbms 中。

Original Text                   Surrogate Key Text
12234 some random text          0000012234 some random text
my text 23                      my text 0000000023
mytext3                         mytext0000000003
123456abcd                      0000123456abcd
text23                          text0000000023
text1                           text0000000001
text111                         text0000000111
text33                          text0000000033
1text123                        0000000001text0000000123
2text124                        0000000002text0000000124

请注意,在本例中,样本中的每一块数字数据都填充到十位十进制数中。

当您加载 DBMS 时,这在您的应用程序中是最容易做到的。您可以编写一个简单的字符串解析例程来完成它。您没有告诉我们您使用的是什么应用程序语言。

如果您在每次查询中只整理有限数量的记录,也可以在检索记录后在您的应用程序中进行。

于 2012-07-24T01:38:05.690 回答