使用带收缩的排序规则时的 MySQL 字符串前缀匹配

标签 mysql collation string-comparison

我有一个自定义的 MySQL 归类,它使用带有缩略语的归类(即定义为具有单一权重的多个字符的序列)。作为一个简化的例子,我定义了类似这样的规则:

<collation name="utf8_my_custom_collation_ci" id="1200">
  <rules>
    <reset>c</reset>
    <p>ch</p>
    <reset>ch</reset>
    <p>d</p>
  </rules>
</collation>

这应该整理“ch”,就好像它是“C”之后和“D”之前的一个完全独立的字母一样,因此 cz < ch < d。它确实如此,所以效果很好。

现在,我的问题是:如何在将“C”和“CH”视为单独字符的同时以通用方式执行子字符串比较?例如,我想要

返回的集合
SELECT word WHERE word LIKE 'c%';
SELECT word WHERE word LIKE 'ch%';

完全不相交。

我意识到这可以通过添加“NOT LIKE”语句来完成,但并非没有将我的整个整理逻辑基本上嵌入到每个查询中。如果我在排序规则中定义了 10 个或更多这样的缩略语,我宁愿不必手动将它们全部包含在一系列条件和 NOT LIKE 中。

如果重要的话,我使用的是 MySQL 5.6。

最佳答案

正如您所说的 'cz' < 'ch',我通常假设首字母为 [x] 的缩略语超出了 'xa' 和 'xz' 的范围。因此,要搜索 [x] 加截断,您可以添加一般排除:

SELECT word WHERE word LIKE '[x]%' AND word > '[x]a%' AND word < '[x]z%'

根据您对宫缩的描述,这应该适用于所有宫缩。

关于使用带收缩的排序规则时的 MySQL 字符串前缀匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27462118/

相关文章:

python - 如何将 Django 模型的实例保存到我的数据库中

mysql - phpMyAdmin - #1267 - 操作 '<' 的排序规则组合非法

swift - 不区分大小写的字符串比较

c# - 为什么字符串 "\u0022"以这个字符串 "\u204D"开头

C 字符串比较不允许空格键

php - PDO MysQL "Update"语句未保存到数据库

mysql - 如何选择条件存储在表中的mysql行?

mysql - 如果相同的查询,则不会计算 MariaDB 性能架构摘要

mysql - mysql 排序规则为 utf8_unicode_ci 时的 sphinx 排序规则

sql - 使用 SQL 排序规则影响性能