表上的 PHP PDO 查询错误具有 json 数据类型(MySQL 5.7.8-rc)

Posted

技术标签:

【中文标题】表上的 PHP PDO 查询错误具有 json 数据类型(MySQL 5.7.8-rc)【英文标题】:PHP PDO query error on table has json data type (MySQL 5.7.8-rc) 【发布时间】:2016-01-20 02:57:56 【问题描述】:

我正在 mysql 5.7 上尝试新的 json 数据类型。当我使用原生 php mysql 查询时,它工作正常,但是当我使用 PDO 查询数据时,它显示此错误:

错误:异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:2036 ' in /some_folder/pdo.php:12 堆栈跟踪:#0 /some_folder/pdo.php(12): PDO->query ('select * from table_has_json_datatype') #1 main

你们知道如何解决这个问题吗?

谢谢。

用我的简单测试代码更新:

<?php

try
    $db = new PDO('mysql:host=some.host;dbname=somedb;charset=utf8', 'user', 'pwd');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
catch(PDOException  $e)
    echo "Error1: ".$e;


try
    $query = $db->query("select * from table_with_json_type");

catch(PDOException $e)
    echo "Error2: ".$e;

?>

【问题讨论】:

你能用代码编辑你的帖子吗 Error: 2036 (CR_UNSUPPORTED_PARAM_TYPE) - 所以实际代码很可能无关紧要。 a) echo 'CLIENT_VERSION: "', $pdo-&gt;getAttribute(PDO::ATTR_CLIENT_VERSION),'"'; 打印什么? (其中 $pdo 是您创建的实际 pdo 实例new PDO...b) 您在哪个操作系统上运行哪个版本的 PHP(例如 PHP 5.4.7/Ubuntu 11.04) 见bugs.php.net/bug.php?id=70384和github.com/php/php-src/commit/… @VolkerK 我的 PDO-mysql 客户端版本是 5.7.5-m15 和 Ubuntu 14.04 和 php 5.6.14,mysql 5.7.8-rc 【参考方案1】:

这是一个向 PHP 开发者#70384报告的错误

刚刚发帖的开发者andrey@php.net:

此错误的修复已提交。

源快照每三个小时打包一次;这种变化 将在下一个快照中。您可以在以下位置获取快照 http://snaps.php.net/.

对于 Windows:

http://windows.php.net/snapshots/谢谢你的报告, 帮助我们改进 PHP。

在 PHP-5.6.19、PHP-7.0 和 master (PHP-7.1) 中修复

感谢您的报告

因此,PHP 5.6.19+ 将支持 JSON 数据类型 对于其他版本,上面有可用的解决方法。

此解决方法将具有 CAST 功能的 JSON 字段修改为 CHAR,从 PHP 的角度来看这很好: 例如:

select *, CAST(json_col as CHAR) as json_col from table_with_json_type

它在所有情况下都对我有用。

要完全兼容,您必须使用 PHP-5.6.19+

【讨论】:

感谢您的回答。你知道下一个版本什么时候发布吗? 铸造对我有用,但问题似乎在 PHP 5.6.19 中没有得到解决 在 PHP 5.6.20 上测试过,无需使用此解决方法即可。 json 数据以 jsonstring 形式出现。有一些配置将其作为 stdClass 返回会很好 救命稻草。谢谢! 这没关系,但值会回来引用。如何摆脱它们?【参考方案2】:

我在 PHP 5.5 中遇到了同样的问题 - 决定更新到 PHP 5.6,但问题仍然存在。转换为 CHAR 会有所帮助,但这不是一个好的解决方案。

我的 PHP 配置使用的是 libmysqlclient,当我将其更改为 mysqlnd(MySQL 本机驱动程序)时,它解决了问题。

所以我建议也这样做。

您可以在此处阅读有关 PHP MySQL 驱动程序的信息: http://php.net/manual/en/mysqlinfo.library.choosing.php

我在 Ubuntu 服务器中使用 apt-get 安装了 mysqlnd 驱动:

apt-get install php5-mysqlnd

【讨论】:

【参考方案3】:

作为一个小附录。将列转换为这样的 char 具有返回带有双引号的值的效果。您可以使用 trim 摆脱它们:

select *, TRIM(BOTH '"' FROM CAST(json_col as CHAR)) as json_col from table_with_json_type

【讨论】:

【参考方案4】:

如果你使用 laravel 或 lumen,在这个到 config/database.php

'options' => [PDO::ATTR_EMULATE_PREPARES => true]

否则可能会尝试安装 myslnd

apt-get install php7.0-mysqlnd

参考:https://laracasts.com/discuss/channels/eloquent/json-column-problem-with-mysql57-and-laravel52#reply-191316

【讨论】:

以上是关于表上的 PHP PDO 查询错误具有 json 数据类型(MySQL 5.7.8-rc)的主要内容,如果未能解决你的问题,请参考以下文章

同一张表上的多个连接,在一个查询中计数

具有多个表的联结表上的 MySQL SELECT 查询

ON 子句具有子查询的两个表上的右外连接

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

SQL Server 错误 1934 发生在 INSERT 到具有计算列 PHP/PDO 的表中

在具有数百万条记录的 2 个表上加入更快