我需要区分以'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排序规则,我认为更改表和整个数据库的排序规则可能不是一个好主意。
这有什么好的解决方法?
答案 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
文件。