如何在Drupal中使用变音符号对文本进行MySQL查询?

时间:2010-09-17 12:05:33

标签: mysql drupal views collation diacritics

我需要区分以'O'开头的节点和以'Ö'开头的节点(o umlaut)。

问题在于,由于节点表和标题列具有utf8_general_ci排序规则,因此MYSQL不会以不同方式处理o和ö变形连接,并且此查询将返回以O开头的节点,以Ö开头的节点

SELECT node.nid AS nid
FROM节点AS节点
在哪里node.status<> 0
AND SUBSTR(node.title,1,1)='O'

由于所有Drupal模块都使用utf8_general_ci排序规则,我认为更改表和整个数据库的排序规则可能不是一个好主意。

这有什么好的解决方法?

2 个答案:

答案 0 :(得分:2)

您可以使用与列正在使用的排序规则不同的排序规则进行比较:

mysql> SELECT 'foo'='föo' COLLATE 'utf8_general_ci';
1
mysql> SELECT 'foo'='föo' COLLATE 'utf8_swedish_ci';
0

oö在瑞典语排序规则中是不同的字母。如果您不希望任何不同的字符匹配,您也可以使用utf8_bin ,甚至同一个字母的不同情况。)

但是,在对每个列的排序规则与每个列的排序规则不同的列进行比较时,意味着不能使用索引。因此,只需将ALTER表格更有效地提供您想要的更具体的排序规则。

答案 1 :(得分:2)

不幸的是,正如您所注意到的,Drupal 6强制执行utf8_general_ci整理。

但是,这是一个已知问题,人们一直在努力允许在settings.php中指定排序规则:Database default collation is not respected

该问题中的currently a patch(#{3}})适用于Drupal 6,可以添加此功能。修补后,您需要做的就是添加:

$db_collation = 'utf8_swedish_ci`;

到您的settings.php文件。