PDO查询缓存错和数据库中文表列名
在php中用PDO操作数据库出错,用PDO::errorInfo()函数可以看到
SQLSTATE[HY000]:
General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll().
Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.
操作中,凡是只查一次就不会出错,比如
$pdo->query($sql);
在这之前
$pdo->query('SET NAMES UTF8');
也没关系.但是,在这之前我写了一个建表的句子,
$c_sql = ("DROP TABLE IF EXISTS x3;CREATE TABLE x4 (x varchar(6),y varchar(6));");
用
$pdo->exec($sql);
执行,在后面的普通查询中就会出错.于是只好关闭$pdo再重连,比如
$pdo = null;
$pdo = new PDO($dsn);
又或者另建一个连接,
$pdo2 = new PDO($dsn);
难道PDO不能多次连着查询吗?或者要按上面说的设置属性PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 为 true?
但设了也不起作用,而且据网上查,有人说从php5.2.1起,这个属性已经默认为true了,我的版本是5.2.6.而且这方法只能在mysql起作用,那岂不是不能移植?
又查,有人说,PDO有bug,不支持一次返回多个查询结果,也就是PDOStatement的nextRowset不能正确执行,给的提示说是什么这是个可有可无的特性,又说,即使是mysql5.2.6,依然这样,而且他测试存储过程,也这种提示.并且说,这两个事情在linux版都没问题.见
http://www.cnblogs.com/bindsang/archive/2008/08/18/1270171.html我的也是这个问题么?似乎又不一样.也不想回到mysql或mysqli,要知道PHP6中会移除非PDO的玩意.
又试,有人说,是应该先把上个缓存清了,比如
$result->fetchAll();
或
$result = null;
试了还不管用.把建表语句去掉,执行两次query,都可以,看来PDO::MYSQL_ATTR_USE_BUFFERED_QUERY的确已经默认是true了.
又试,把建表语句换成别的语句,比如update,正常.
最后想了想,反正建表是很少的,而且不用和其他在一起,比如作事务什么的.就这样吧.
最终还是php.net说得对,原来是建表语句一次只能执行一条,我于把那个语句分成两段,这下所有都正常了.
再说说中文表名和字段名,mysql5.0时曾说过将在mysql5.1支持.在mysql5.1中建表,表文件名中的中文字符会用utf8编码代替,比如'中'字会变成@4e2d,这样在库目录下就会有@4e2d.frm之类文件.但是在windows的控制台,看这样的中文是乱码,必须set names gbk;才正常显示,真是奇怪.sqlite因为没有set names命令,所以在控制台看到中文是乱码,只有sqlite spy勉强可以正常显示,除了字段中文名在树中显示不出来,在查询结果中能显示.用windows的chcp 65001来改变控制台的页代码为utf-8,然后把字体设为Lucida Console,再查,显示文字不全,最小化窗口再打开,能显全.但再查又不全,得反复重复刚才的操作,据ms文档说,可以在注册表中改控制台字体,不过没看明白.
在控制台,如果在sqlite中建一个中文表名,在脚本中或sqlite spy中看是乱码,也就是说不是UTF8的.mysql未设置时,会提示中文字不是合法的utf8字符,如果set names gbk; 然后再来,就一切正常,包括表名,字段名,和insert 中文,都正常,在phpmyadmin中看也是中文,似乎是windows下自己把这些字转成utf8了,就是这么怪.
在linux下,只在命令行下测试了sqlite2.8.7的版本和mysql5.0.24,都支持中文名.mysql5.0.24这个版本也支持让人有些惊讶,不过在命令行中一定要用`把中文表名或字段名包起来,否则要出错,不知道5.1的linux版本是不是也这样.
最后说一下,php脚本中最后查得的结果,输出中文键没问题,因为试了下,数组可以用中文作键,变量名也可以用中文.php文档中只说了可以用gb2312那样编码,但实际测试utf8的也行.
阅读(2344) | 评论(0) | 转发(0) |