我正在使用一个使用德语名称的数据库,即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
,必须保持这种状态。
答案 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
名称开头。该主题提到了utf8
,utf8mb4
和latin1
CHARACTER SETs
。 必须使用COLLATION
给定的CHARACTER SET
。
首先选择一个CHARACTER SET
。 utf8
,utf8mb4
和latin1
都处理德语。但是,如果您希望处理其他语言,请考虑:
latin
仅限于西欧语言。例如,它不能处理希腊语。 (latin1每个字符需要1个字节。)utf8mb4
涵盖了所有已知语言,还有更多空间。 (每个字符最多4个字节)在版本5.5.3之前,此CHARACTER SET
不可用。utf8
是utf8mb4
的子集,省略了一些中文字符和较新的表情符号。 (每个字符最多3个字节) CHARACTER SET
提供字符的字节编码。 COLLATION
说明两个字符串的比较方式,例如ss
和ß
是否应该被视为相等。
选择CHARACTER SET
后,选择COLLATION
。或者,让ID为“默认”:latin1_swedish_ci
/ utf8_general_ci
/ utf8mb4_general_ci
。这些默认值有利于多语言使用;但这是值得商榷的。所有这些默认值都是ss
!= ß
。
展望未来,对于整体多语言数据,“最佳”解决方案为utf8mb4
和utf8mb4_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
作为两个字母进行比较。