我有一个自定义的 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/