【问题标题】:How to do MySQL queries on text with umlauts in Drupal?如何在 Drupal 中对带有变音符号的文本进行 MySQL 查询?
【发布时间】:2010-09-17 12:05:32
【问题描述】:

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

问题在于,由于节点表和标题列有utf8_general_ci排序规则,MYSQL并没有区别对待o和ö变音符号,这个查询返回以O开头的节点和以Ö开头的节点

选择 node.nid 作为 nid
FROM 节点 AS 节点
WHERE node.status 0
AND SUBSTR(node.title, 1, 1) = 'O'

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

对此有什么好的解决方法?

【问题讨论】:

    标签: mysql drupal views collation diacritics


    【解决方案1】:

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

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

    (oö 在瑞典语排序规则中是不同的字母。如果您不希望 任何 个不同的字符匹配,您也可以使用 utf8_bin,即使是不同的大小写相同的字母。)

    但是,如果对排序规则与每列排序规则不同的列进行比较,则意味着无法使用索引。因此,将表格ALTER 转换为您想要的更具体的排序规则可能会更有效。

    【讨论】:

    • 将 COLLATE 添加到查询中会因带有连接的查询而失败,因此我最终使用瑞典用户 Drupal 组建议的脚本将数据库、表和列切换为 utf8_swedish_ci。如果有人感兴趣,就在这里:phoca.cz/documents/38-tools/…
    • 虽然这是一个很好的通用 MySQL 解决方案,但它需要绕过 Drupal 的数据库 API,因为 Drupal 6 目前不支持 utf8_general_ci 以外的任何东西。
    【解决方案2】:

    不幸的是,正如您所注意到的,Drupal 6 强制执行utf8_general_ci 排序规则。

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

    在该问题 (#90) 中有 currently a patch 用于审查 Drupal 6,增加了此功能。修补后,您需要做的就是添加:

    $db_collation = 'utf8_swedish_ci`;
    

    到您的settings.php 文件。

    【讨论】:

    • 感谢有关补丁的提示。会给它一个旋转。
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2019-12-08
    • 2010-11-28
    相关资源
    最近更新 更多