使用 LIKE 条件搜索 sql 的德语字符

searching for german characters with sql using LIKE condition

我正在使用一个使用德语名称的数据库,即 Fürst。现在我构建了一个带有搜索字段的 HTML-Form。使用 htmlentities 并进行一些测试以验证未输入 "bad stuff",然后在查询之前输入 html_entity_decode。一个简单的查询将如下所示:

SELECT * FROM user_table WHERE firstname LIKE "%fü%" OR lastname LIKE "%fü%" 

然而,这个发现不仅 Fürst,而且 Furt。我怎样才能解决这个问题?数据库和表在 utf8_unicode_ci 中并且必须保持原样。

这是collations for each charset

SELECT * FROM user_table WHERE firstname LIKE "%fü%" COLLATE utf8mb4_german2_ci            
                          OR lastname LIKE "%fü%" COLLATE utf8mb4_german2_ci

utf8mb4_unicode_ci 也可能有效。

(简单的评论太长了。)

COLLATION 名称以 CHARACTER SET 名称开头。此线程提到了 utf8utf8mb4latin1 CHARACTER SETs。对于给定的 CHARACTER SET.

,您必须 使用 COLLATION

挑一个CHARACTER SETutf8utf8mb4latin1 都处理德语。但如果您希望处理其他语言,请考虑:

  • latin 仅限于西欧语言。例如,它不能处理希腊语。 (latin1 每个字符需要 1 个字节。)
  • utf8mb4 涵盖所有已知语言,还有更多空间。 (每个字符最多 4 个字节)此 CHARACTER SET 在版本 5.5.3 之前不可用。
  • utf8utf8mb4 的一个子集,省略了一些汉字和较新的表情符号。 (每个字符最多 3 个字节)

CHARACTER SET 提供字符的字节编码。 COLLATION 表示两个字符串如何比较,例如 ssß 是否应该被视为相等。

选择 CHARACTER SET 之后,选择 COLLATION。或者让 id 'default': latin1_swedish_ci / utf8_general_ci / utf8mb4_general_ci。这些默认值对于多语言使用来说还算不错;但这值得商bat。 ss != ß 所有这些默认值。

展望未来,"best" 解决方案是 utf8mb4utf8mb4_unicode_520_ci 整体多语言数据。

如果您只关注德语,那么您可能 想考虑 ..._german2_ci 归类。例如:

utf8_german2_ci     A=a=ª=À=Á=Á=Â=Ã=Å=à=á=á=â=ã=å=Ā=ā=Ą=ą     < ae=Ä=Æ=ä=æ < az < B
utf8_unicode_520_ci A=a=ª=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą < ae=Æ=æ     < az < B
utf8_unicode_ci     A=a=ª=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą < ae         < az < Æ=æ < B
utf8_general_ci     A=a=À=Á=Á=Â=Ã=Ä=Å=à=á=á=â=ã=ä=å=Ā=ā=Ą=ą   < Z < Æ=æ

utf8mb4_... 归类同上。)

所以,如果您真的很关心 æ 的比较方式,则需要对排序规则挑剔。 (utf8 和 utf8mb4 作用相同。)More collation comparisions.

ue=Ü=ü 用于 ..._german2_ci 排序规则,但可能没有其他排序规则。其他的(大部分)对待U=u=Ü=ü,留下ue作为两个字母进行比较。