使用与收缩的整理时的MySQL字符串前缀匹配

时间:2014-12-13 18:17:03

标签: 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>

这应该整理&#34; ch&#34;好像它是&#34; C&#34;之后完全独立的一封信。在&#34; D&#34;之前,以便cz&lt; ch&lt; d。它确实如此,所以效果很好。

现在,我的问题是:在处理&#34; C&#34;时,我如何以通用方式执行子串比较?和&#34; CH&#34;作为单独的字符?例如,我想要

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

完全脱节。

我意识到这可以通过添加&#34; NOT LIKE&#34;语句,但不是没有将我的整个校对逻辑嵌入到每个查询中。如果我在整理中定义了10个或更多这样的收缩,我宁愿不必在一系列条件中手动包含所有这些收缩而不是喜欢。

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

1 个答案:

答案 0 :(得分:0)

正如你所说'cz'&lt; 'ch',我通常认为初始[x]的收缩超出'xa'和'xz'的范围。因此,对于搜索[x]加截断,您可以添加一般排除:

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

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