7

我正在 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 * 来自 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;
}
?>
4

4 回答 4

13

这是向 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+

于 2015-12-15T17:27:12.703 回答
1

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

select *, TRIM(BOTH '"' FROM CAST(json_col as CHAR)) as json_col from table_with_json_type
于 2017-10-20T15:33:47.717 回答
1

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

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

所以我建议也这样做。

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

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

apt-get 安装 php5-mysqlnd

于 2016-04-26T17:45:11.200 回答
0

如果你使用 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

于 2019-10-29T07:16:47.207 回答