0

我到处寻找答案,但似乎仍然找不到

服务器:本地主机
MySQL 版本:5.6.17

我已将我的 db 表设置为utf8mb4,以便获得更多的字符可能性。当我将某些散列信息插入到我的表中时,根据字符串中的随机字符序列,实际上只有字符串的一个片段被插入(如果没有完全留空)。

在我的 pdo 语句句柄中,我在准备查询之前执行了 charset=utf8mb4 ,并且作为故障保险,我之前也 SET NAMES utf8mb4 。所以我认为CHARSET和COLLATE的一切都应该是洁净的。

所以我的问题是,我应该怎么做才能成功地将整个字符串放入字段中?是否有一些字符转义我应该这样做我失踪了?

编辑:当我将字符串复制/粘贴到 phpmyadmin 中时,它成功地将整个字符串放入字段中。

4

2 回答 2

0

让我们看看截断字符串的十六进制。

答案可能在于未能确定客户端正在使用 utf8mb4 viaSET NAMES utf8mb4或连接调用中的某些参数。

http://php.net/manual/en/ref.pdo-mysql.connection.php

于 2015-09-08T06:57:57.657 回答
0

好的,所以我找到了我正在寻找的解决方案,并且觉得自己像个傻瓜,花了这么多时间在修复上。也许这会帮助有人沿着同样的道路旅行,所以我会自己发布答案。

更多关于行为:

PDO 无法将字符串完整地放入 db 字段的原因是因为它不是 utf8_encoded。(这是我感到愚蠢的地方)。认为它已经准备好进入,而我所要做的就是绑定,这是错误的。相反,它会在第一个无法识别的字符处终止字符串(使用 utf8mb4),或者放入整个字符串,并将无法识别的字符替换为 ? (仅使用 utf8)。

解决方案 :

我最终做的是获取原始字符串,运行它ut8_encode(),因为这是程序提供的信息而不是用户输入,所以我没有费心绑定而是使用$pdoHandle->quote($utf8String)它准备插入它。

执行后,插入整个字符串。现在,当我选择散列信息时,我运行utf8_decode并准确地将我插入到数据库中的内容。

更好的做法? 如果您知道解决此解决方案的更好方法,我愿意听取替代方案。请说明原因,以便我了解您的方法。

于 2015-09-09T16:06:21.050 回答