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

时间:2016-03-03 10:35:48

标签: mysql sql mariadb special-characters sql-like

我正在使用一个使用德语名称的数据库,即Fürst。现在我用搜索字段构建了一个HTML表单。使用htmlentities和一些测试来验证没有输入“坏东西”,然后在查询之前输入html_entity_decode。然后,一个简单的查询将如下所示:

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

但是,这不仅可以找到Fürst,还可以查找Furt。我怎样才能解决这个问题?数据库和表位于utf8_unicode_ci,必须保持这种状态。

2 个答案:

答案 0 :(得分:1)

以下是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可能也会起作用。

答案 1 :(得分:1)

(简单评论太长了。)

COLLATION名称以CHARACTER SET名称开头。该主题提到了utf8utf8mb4latin1 CHARACTER SETs必须使用COLLATION给定的CHARACTER SET

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

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

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

选择CHARACTER SET后,选择COLLATION。或者,让ID为“默认”:latin1_swedish_ci / utf8_general_ci / utf8mb4_general_ci。这些默认值有利于多语言使用;但这是值得商榷的。所有这些默认值都是ss!= ß

展望未来,对于整体多语言数据,“最佳”解决方案为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作为两个字母进行比较。