切换到utf8mb4后,MySQL INSERT缺少信息

时间:2015-09-08 05:24:37

标签: mysql pdo character-encoding insert utf8mb4

我正在寻找一个答案,但似乎无法找到它

  

服务器:localhost
  MySQL版本:5.6.17

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

在我的pdo语句的句柄中,我在准备查询之前执行charset = utf8mb4,并且作为失败保护我之前也设置了NAMES utf8mb4。所以我认为一切都应该与CHARSET和COLLATE保持一致。

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

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

2 个答案:

答案 0 :(得分:0)

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

可能答案在于未能确定客户端是通过SET NAMES utf8mb4使用utf8mb4还是连接调用上的某个参数。

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

答案 1 :(得分:0)

好的,所以我找到了我正在寻找的解决方案,感觉就像是花了很多时间修复的假人。也许这会帮助那些沿着同一条路走下去的人,所以我会自己发布答案。

关于行为的更多信息:

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

解决方案:

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

执行后,插入了整个字符串。现在,当我选择散列信息时,我运行utf8_decode,并且正好在数据库中插入了。

更好的做法? 如果您知道更好的方法来解决这个问题,我可以随时听取替代方案。请详细说明原因,以便了解您的方法。