MDB2 disconnects and forgets charset setting when reconnecting我们最近调试了一个奇怪的错误。找到了解决方案,但是该解决方案并不完全令人满意。 我们使用IntSmarty来本地化我们的网站,并使用我们自己的包装器将本地化的字符串存储在数据库中。 IntSmarty在其析构函数中保存它可能具有的所有新字符串,从而导致数据库调用。 我们使用MDB2的Singleton实例针对MySQL进行查询,并且在连接后,我们使用SetCharset()函数将字符集更改为UTF-8。我们发现在完成最终插入时,IntSmarty保存的字符串被解释为ISO-8859-1。我们仔细查看了查询日志,发现在调用IntSmarty的析构函数之前,MySQL连接已断开连接。然后重新建立它,但是在新连接上没有发出" SET NAMES utf8"查询。这导致保存的字符串被MySQL解释为ISO-8859-1。 似乎没有设置MDB2上默认字符集的选项。我们针对此问题的解决方案是通过添加以下内容来更改MySQL服务器配置
到my.cnf。这仅解决了我们的字符集始终相同的问题。 因此,有什么方法可以防止在运行所有查询之前断开连接吗?我可以强制在其他所有操作之后销毁MDB2实例吗? 打开持久连接有效,但不是理想的答案。 从PHP5文档中:
(强调我的) 可能发生的情况是您的脚本没有显式销毁对象,因此,当PHP到达脚本的末尾时,它将开始按照其感觉的顺序清理所有内容(在您的情况下,这是先关闭数据库链接) 。 如果在脚本实际结束之前明确销毁IntSmarty对象,那应该可以解决您的问题。 |