在不修改数据库编码的情况下更正 MySQL 中的 "Incorrect string value"
Correct "Incorrect string value" in MySQL without amending the databases encoding
PHP: 7.2.5
Laravel: 7.25
我们有一个错误,极少数用户试图插入包含 '' 字符的副本。我假设这是因为从 PDF 复制和粘贴,我以前见过它们有换行符。这会产生以下错误:
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF4\x8F\xB0\x80</...' for column 'body' at row 1 (SQL: update `post` set `body` = <p></p>, `body_raw` = , `post`.`updated_at` = 2020-10-06 10:34:22 where `id` = 1)
字符'':
- 十进制字符代码:56319、56320
- 十六进制字符代码:0xdbff、0xdc00
- HTML 具有命名字符引用:
� �
查看 Google,建议您可以从 utf8 to utf8mb4 更新数据库编码。这可能是最佳解决方案,但我们有一个大型数据库,我不方便修改编码(尽管这可能非常安全)。我担心可能的数据 loss/corruption.
由于这个问题只出现在我们的错误系统中的这 1 个字符上,并且 100% 不需要,我倾向于在将它保存到数据库之前将其删除,以创建最小的更改。
我倾向于做以下事情:
str_replace("","", $post);
但是如果我将字符 '' 粘贴到我的任何代码编辑器中,它就会消失(我假设是 utf8 编码)。实现此目标的最佳方法是什么?
在@04FS 的大力帮助下(感谢)。我找到了解决办法。如前所述,我认为数据库 utf8 到 utf8mb4 修复可能是这里的最佳途径。但是为了不修改数据库,这里是我找到的解决方案。
这里主要的混淆问题是字符“”。因为我不能将它输入到我的文本编辑器中,所以很难使用。所以我依靠第 3 方网站对其进行编码。一个建议是使用 char() 来编写和匹配字符。但是在 2 个不同的网站上,字符代码出现了 char(111) 和 char(244)。使用 char(244) 我能够使用 str_replace,但它只创建了部分替换并破坏了 SQL 查询。
@04FS 提到尝试 urlencode(),它给了我那个字符的 '%F4%8F%B0%80'。这与数据库错误匹配。因此以下解决方案可以正常工作:
private function removeSpecialCharacters($str) {
$str = str_replace(urldecode('%F4%8F%B0%80'), '', $str);
return $str;
}
PHP: 7.2.5 Laravel: 7.25
我们有一个错误,极少数用户试图插入包含 '' 字符的副本。我假设这是因为从 PDF 复制和粘贴,我以前见过它们有换行符。这会产生以下错误:
SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xF4\x8F\xB0\x80</...' for column 'body' at row 1 (SQL: update `post` set `body` = <p></p>, `body_raw` = , `post`.`updated_at` = 2020-10-06 10:34:22 where `id` = 1)
字符'':
- 十进制字符代码:56319、56320
- 十六进制字符代码:0xdbff、0xdc00
- HTML 具有命名字符引用:
� �
查看 Google,建议您可以从 utf8 to utf8mb4 更新数据库编码。这可能是最佳解决方案,但我们有一个大型数据库,我不方便修改编码(尽管这可能非常安全)。我担心可能的数据 loss/corruption.
由于这个问题只出现在我们的错误系统中的这 1 个字符上,并且 100% 不需要,我倾向于在将它保存到数据库之前将其删除,以创建最小的更改。
我倾向于做以下事情:
str_replace("","", $post);
但是如果我将字符 '' 粘贴到我的任何代码编辑器中,它就会消失(我假设是 utf8 编码)。实现此目标的最佳方法是什么?
在@04FS 的大力帮助下(感谢)。我找到了解决办法。如前所述,我认为数据库 utf8 到 utf8mb4 修复可能是这里的最佳途径。但是为了不修改数据库,这里是我找到的解决方案。
这里主要的混淆问题是字符“”。因为我不能将它输入到我的文本编辑器中,所以很难使用。所以我依靠第 3 方网站对其进行编码。一个建议是使用 char() 来编写和匹配字符。但是在 2 个不同的网站上,字符代码出现了 char(111) 和 char(244)。使用 char(244) 我能够使用 str_replace,但它只创建了部分替换并破坏了 SQL 查询。
@04FS 提到尝试 urlencode(),它给了我那个字符的 '%F4%8F%B0%80'。这与数据库错误匹配。因此以下解决方案可以正常工作:
private function removeSpecialCharacters($str) {
$str = str_replace(urldecode('%F4%8F%B0%80'), '', $str);
return $str;
}