【问题标题】:MySQL find umlaute by "oe", "ae", "ue"MySQL 通过“oe”、“ae”、“ue”查找变音符号
【发布时间】:2016-12-02 20:01:45
【问题描述】:

我正在尝试构建一个 MySQL 搜索查询。 LIKE 完全可以,但客户希望输入带有“oe”找到“ö”、“ae”找到“ä”和“ue”找到“ü”,因为这在德国相当普遍。
在将每次出现的“oe”替换为(oe|ö) 之后,我尝试使用REGEXP,但REGEXP 是严格的并且不匹配(例如)“é”到“e”。
有没有办法让 LIKE 匹配 "oe|ue|ae" 或者我没有想到的其他方式?
谢谢,
托马斯

【问题讨论】:

  • 哇,真快。在我完成之前投了反对票...... :(
  • 或许可以考虑投资像 Solr 这样的搜索引擎。
  • 提示:在mysql中设置utf8_general然后e会找到èstackoverflow.com/questions/2344118/utf-8-general-bin-unicode
  • 不使用正则表达式 @JustOnUnderMillions
  • 我不会使用正则表达式。 Mysql 的正则表达式不适用于多字节字符。 The REGEXP and RLIKE operators work in byte-wise fashion, so they are not multibyte safe and may produce unexpected results with multibyte character sets.dev.mysql.com/doc/refman/5.7/en/regexp.html

标签: php mysql regex


【解决方案1】:

Character Sets and Collations Supported by MySQL 我只能找到两个德语排序规则:

  • latin1_german1_ci
  • latin1_german2_ci

似乎latin1_german2_ci 是您想要的,但它需要Latin1:

latin1_german2_ci(电话簿)规则:

  • Ä = AE​​li>
  • Ö = OE
  • Ü = UE
  • ß = ss

如果您的表/列尚未使用它,您可以在查询本身中强制进行此类排序,例如:

mysql> SELECT _latin1'oe' collate latin1_german2_ci ='ö' AS are_equal;
+-----------+
| are_equal |
+-----------+
|         1 |
+-----------+
1 row in set (0.00 sec)

如果您的应用程序使用的是 Latin1,这应该可以解决问题。否则,我真的不知道:)

免责声明:我对德语一无所知。可能还有其他语言使用类似的规则。

【讨论】:

  • 谢谢!这真的很有帮助。不幸的是,我们的应用程序使用 UTF8 ...
  • @thomas 如果您有机会在 UTF-8 上进行测试,请分享您的经验。正如我所说,我真的不知道 MySQL 处理混合编码。
  • 我收到“非法混合排序规则”错误。正如你所说, latin_german2_ci 需要 latin1 个字符。
  • 但这对以后的项目真的很有帮助。现在采用了通过REPLACE() 转换我的搜索字符串和结果的丑陋方式,这里建议但后来删除了(感谢未知)
  • 感谢您的CONVERT() 评论,我几乎 让它工作了:SELECT convert(_utf8'ausdruecklich' using latin1) COLLATE latin1_german2_ci = convert('ausdrücklich' using latin1) as equal 但后来出现了这个:stackoverflow.com/questions/7917367/… 我想我运气不好。再次感谢您的帮助!
【解决方案2】:

如果您使用的是 utf8,则需要 COLLATE utf8_german2_ci。请参阅collation chart(并且,根据该图表,german2 是唯一满足您需求的。)

mysql> SELECT "oe" = "ö" COLLATE utf8_german2_ci;
+-------------------------------------+
| "oe" = "ö" COLLATE utf8_german2_ci  |
+-------------------------------------+
|                                   1 |
+-------------------------------------+

但是,将列声明为COLLATE utf8_german2_ci 比在比较中使用该子句更有效。

(如果您使用的是 utf8mb4,请相应更改拼写。)

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多