【发布时间】:2020-10-06 10:56:12
【问题描述】:
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:
&#xdbff; &#xdc00;
查看 Google,建议您可以从 utf8 to utf8mb4 更新 DB 编码。这可能是最佳解决方案,但我们有一个大型数据库,我对修改编码感到不安(尽管这可能非常安全)。我担心可能的数据丢失/损坏。
由于此问题仅出现在我们的错误系统中的这 1 个字符上,并且 100% 不需要,因此我倾向于在将其保存到数据库之前将其删除,以创建最少的更改。
我倾向于做以下事情:
str_replace("????","", $post);
但如果我粘贴字符 '????'在我的任何代码编辑器中它都会消失(我假设是 utf8 编码)。实现这一目标的最佳方法是什么?
【问题讨论】:
-
您的数据库排序规则是什么?我认为不是
utf8mb4_unicode_ci -
\xF4\x8F\xB0\x80和0xdbff, 0xdc00有什么区别? -
“但是如果我粘贴字符 '????'进入我的任何代码编辑器,它就会消失” - 作为替代方案,您可以使用
chr从(十进制)整数字节值创建正确的字节序列。 -
制作
urlencode($post->body)的调试输出,该位置的百分比编码将有助于检查您实际处理的字节值。 -
@sta 这正是我想要完成的,但如果你将代码复制到 PhpStorm 或 Sublime 文本中,特殊字符就会消失。我找到了一个解决方案,写在下面。不过感谢您的帮助。
标签: php mysql laravel laravel-7