【问题标题】:searching for german characters with sql using LIKE condition使用 LIKE 条件使用 sql 搜索德语字符
【发布时间】:2023-03-11 11:16:01
【问题描述】:

我正在使用一个使用德语名称的数据库,即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 中,并且必须保持这种状态。

【问题讨论】:

  • 在比较中添加一个 collat​​e 子句,例如 WHERE firstname collate german_ci like...
  • 你能说得更具体些吗?没有german_ci。当我使用latin1_german2_ci 时,它会显示:#1253 - COLLATION 'latin1_german2_ci' is not valid for CHARACTER SET 'utf8'。当我尝试utf8_unicode_ci 时,得到的结果与原帖中的结果相同
  • 我不知道您的 dbms 产品的排序规则名称。也许你应该标记你正在使用的 dbms,你会得到一个适合你的答案。
  • 服务器在 debian8.3 上运行 phpmyadmin 4.5.2 和 10.1.9-MariaDB。这是你的意思吗?

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


【解决方案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.你是怎么想出 utf8_bin 的? 2. 它不工作 "#1253 - COLLATION 'latin1_german2_ci' 对 CHARACTER SET 'utf8mb4' 无效"
  • @yangsunny 我以为你说表在 utf8_unicode_ci 中。对于 utf8_unicode_ci 这是有效的。而且该消息错误似乎与此查询无关。你从哪里得到 latin1_german2_ci?
  • sry,我的意思当然是“#1253 - COLLATION 'utf8_bin' 对 CHARACTER SET 'utf8mb4' 无效”。并且数据库肯定在 utf8_unicode_ci 中。
  • @yangsunny 好的,但是在 Maria db 中,最低级别的字符集具有优先级,列排序规则会覆盖表排序规则,而表排序规则会覆盖数据库排序规则等。
【解决方案2】:

(对于简单的评论来说太长了。)

COLLATION 名称以 CHARACTER SET 名称开头。这个帖子提到了utf8utf8mb4latin1CHARACTER 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 '默认':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=Ü=ü 视为两个字母进行比较。

【讨论】:

  • 周末,我想出了一个解决方案,将COLLATE latin1_german2_ci 用于表中的列,Default CHARSET=utf8 COLLATE=utf8_unicode_ci 用于表本身。这将解决我的问题,但我不知道是否可以为列和表选择不同的排序规则,或者它只是一个肮脏而快速的解决方案......
  • 我的数据库将只包含德语,这意味着我必须区分 A 和 Ä。而且我需要从数据库中获取数据并以 HTML 格式显示。当我使用 latin1_german2_ci(它之前设置的字符集/排序规则)时,我必须做一些 utf8_encode/decode。为了拯救我,我想我的选择将是 utf8_german2_ci 或 utf8mb4_german2_ci。非常感谢您对 CHARACTER SET 和 COLLATION 的非常好的和详细的解释。
  • 我现在将所有表和列都转换为 utf8_german2_ci。正如你所提到的,在这个排序规则中,A=a &lt; ae=Ä=ä 这应该意味着如果我搜索ae,应该找到ä,对吧?但是,它没有……为什么?
  • Grrrr... 我知道REGEXP 在这方面不够用,但我认为LIKE 还可以。 SET NAMES utf8 COLLATE utf8_german2_ci; select 'ue' = 'ü', 'ue' LIKE 'ü', 'ü' LIKE 'ue'; --> 1,0,0。所以,我所说的关于他们如何比较的内容并没有完全转移到LIKE。考虑使用 bugs.mysql.com 针对 LIKE 和排序规则提交错误。
猜你喜欢
  • 2013-03-14
  • 1970-01-01
  • 2016-12-24
  • 2012-06-03
  • 1970-01-01
  • 2011-07-08
  • 2018-11-02
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多