【问题标题】:MySQL INSERT missing info after switch to utf8mb4切换到 utf8mb4 后 MySQL INSERT 缺少信息
【发布时间】:2015-12-03 16:00:13
【问题描述】:

我到处寻找这个问题的答案,但似乎仍然找不到它

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

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

在我的 pdo 语句句柄中,我在准备查询之前执行了 charset=utf8mb4,并且作为故障安全,我之前也设置了名称 utf8mb4。所以我认为一切都应该是 CHARSET 和 COLLATE 的犹太教。

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

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

【问题讨论】:

  • 我尝试插入的 srting 示例 M^)E¬öJª1t®LÇÕtËe?~Ru4M,ª ¡Ç5DRE#'£zcð/Ó,Fà· –ÐoAK£ë¿à¾9Ú
  • 真的吗?这看起来更像是BLOB,而不是任何当前语言中的某种可读形式的TEXT

标签: mysql pdo character-encoding insert utf8mb4


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    有关行为的更多信息:

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

    解决方案:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 2010-10-11
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多