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


PHP PDO query error on table has json data type (MySQL 5.7.8-rc)

我在mysql 5.7上尝试新的json数据类型。当我使用本地php mysql查询时,它工作得很好,但是当我使用PDO查询数据时,它显示这个错误:

错误:异常'PDOException' with message 'SQLSTATE[HY000]: General Error: 2036 ' in/some_folder/PDO .php:12 Stack trace: #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;
}
?>

这是一个向PHP开发者报告的Bug #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数据类型对于其他版本,上面有一个解决方案。

这个解决方案修改JSON字段与CAST特性为CHAR,这是很好的从PHP的角度来看:如:

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

这对我来说在所有情况下都很有效。

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

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

我的PHP配置使用libmysqlclient,当我把它改为mysqlnd (MySQL本地驱动程序)它解决了这个问题。

所以我建议你也这么做。

你可以在这里阅读PHP MySQL驱动程序:http://php.net/manual/en/mysqlinfo.library.choosing.php

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

apt-get install php -mysqlnd

作为一个小附录。将列强制转换为这样的字符会返回带双引号的值。你可以使用trim:

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

如果您使用laravel或lumen,请在此配置/database.php

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

可能是尝试安装mysland

apt-get install php7.0-mysqlnd

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