我有一个自定义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。
答案 0 :(得分:0)
正如你所说'cz'&lt; 'ch',我通常认为初始[x]的收缩超出'xa'和'xz'的范围。因此,对于搜索[x]加截断,您可以添加一般排除:
SELECT word WHERE word LIKE '[x]%' AND word > '[x]a%' AND word < '[x]z%'
根据您对宫缩的描述,这应适用于所有宫缩。