2014-12-13 55 views
2

我有一个自定义的MySQL排序规则,利用收缩排序(即多个字符的序列定义为具有单一的权重)。作为一个简单的例子,我有这样的事规则所定义的:使用排序与收缩时使用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”,就好像是“d”之前后“C”和一个完全独立的一封信,让CZ < CH < d。它确实如此,所以很好地工作。

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

SELECT word WHERE word LIKE 'c%'; 
SELECT word WHERE word LIKE 'ch%'; 

返回的集合是完全不相交的。

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

如果有问题,我使用MySQL 5.6。

回答

0

正如你所说'cz'<'ch',我通常假设初始[x]的收缩超出'xa'和'xz'的范围。因此,对于搜索[X]加截断,您可以添加一个普遍排除:

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

从你宫缩的描述,这应该适用于所有的人。