我在mysql 5.7上尝试新的json数据类型。当我使用本机php mysql查询时,它工作正常,但当我使用PDO查询数据时,它显示此错误:
错误:异常'PDOException',消息'SQLSTATE [HY000]:/some_folder/pdo.php:12中的常规错误:2036'堆栈跟踪:#0 /some_folder/pdo.php(12):PDO-> query('select * from table_has_json_datatype')#1 {main}
你们知道如何解决这个问题吗?
感谢。
使用我的简单测试代码进行更新:
{{1}}
答案 0 :(得分:13)
向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数据类型 对于其他版本,上面提供了一种解决方法。
此解决方法将带有CAST功能的JSON字段修改为CHAR,从PHP的角度来看这很好: 例如:
data test;
array myVals {3,4} myVal1_1 - myVal1_4
myVal2_1 - myVal2_4
myVal3_1 - myVal3_4;
do i = 1 to 3;
do j = 1 to 4;
myVals{i,j} = j - i + 3;
end;
end;
array newArray {*} myVals{1}; *All of these throw errors;
array newArray {*} myVals[1];
array newArray {*} myVals(1);
array newArray {*} myVals{1,};
len2ndDim = dim2(myVals); *this produces a column with value 4;
array newArray {len2ndDim}; *this throws error for "len2ndDim" not being an integer constant or *;
run;
在所有情况下,它都对我有用。
要完全兼容,您必须使用PHP-5.6.19 +
答案 1 :(得分: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 install php5-mysqlnd
答案 2 :(得分:1)
作为一个小附录。将列强制转换为类似于char的效果,可以使用双引号返回值。你可以使用trim来摆脱它们:
select *, TRIM(BOTH '"' FROM CAST(json_col as CHAR)) as json_col from table_with_json_type
答案 3 :(得分:0)
如果您使用laravel或lumen,在此配置config / database.php
'options' => [PDO::ATTR_EMULATE_PREPARES => true]
否则可能会尝试安装myslnd
apt-get install php7.0-mysqlnd