php - 防止非法混合排序规则/检查 php 中的正确排序规则

标签 php mysql mysqli utf-8 collation

我的应用程序正在处理网上商店/互联市场(如 ebay)中人们订单的送货地址。 我已经考虑了 UTF-8 编码,这意味着它可以正确处理 kyrillic、中文等字符。但是,有时我会收到带有未知字符 � 的条目,例如在 ebay 上查看的送货地址中已经出现了。所以一路上没有任何问题 - 字符串就是这样传递的。

现在我正在对官方(德语)地址数据库执行地址检查,如下所示:

$query = "SELECT DISTINCT * FROM adrCheck WHERE zip='".$zip."' AND street='".$street." AND city='".$city."'";

如果至少有一个结果,我知道地址一定是正确的。 无论如何,当出现那些不正确的字符时,我收到一个 SQL 错误 MYSQLi Error (#1267): Illegal mix of collat​​ions (cp850_general_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 我可以使用react到。 但是我希望能够事先检查并仅将那些编码正确的参数包含在查询中。

我试过了

print_r(mb_detect_encoding("K�ln")); // gives me UTF-8
print_r(mb_check_encoding("K�ln", "UTF-8")); // gives me 1 / true

preg_match method这也告诉我它是有效的 UTF-8。

我忽略了什么?关于如何处理这种偶尔出现的困惑用户输入有什么建议吗?

最佳答案

你的问题发生是因为你正在接收一个 latin-1 编码的字符串(很可能是因为你提到了一些关于德语的东西),并尝试将它们用作 UTF-8字符串。 这在大多数情况下都可以正常工作,因为 latin-1 构建在 ASCII 之上,并且 ASCII 的所有字符在 中都是相同的>UTF-8(所以你的数据库不关心)。

但德语 Umlautelatin-1UTF-8 中的编码不同,如果您尝试解释 älatin-1 中作为 UTF-8 它回退到您在上面显示的 � 符号。

您的测试 print_r(mb_detect_encoding("K�ln")); 告诉您它是 UTF-8,因为 �-符号本身是 UTF- 的一部分8.通过复制错误字符串,它可能是在复制 �-符号,而不是曾经位于其位置的无效字符

尝试使用 http://php.net/manual/de/function.mb-convert-encoding.php 将您的输入字符串转换为 UTF-8

关于php - 防止非法混合排序规则/检查 php 中的正确排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43450471/

相关文章:

php - Magento 管理员登录页面中的 "Error 404 Not Found"

php - og :image ignored

php - 如何将当前日期添加到现有表?

php - MySql 更新上的投票系统将不起作用

PHP HTML DOM 解析器从 img 标签中选择 alt

php - 使用 php 和 mysql 进行交叉表

php - Mysql 更新查询,如果值没有改变怎么办?我该如何检查?

php - 打印数据库的所有字段

php - 如何使用 PHP 获取特定列名称并分配数组?

php - 为什么会出现这种情况? mysqli_query() : Empty query in/home/evansbwg/public_html/Old Things/Website/insert. php 第 52 行