表上的 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->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)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?