MDB2断开连接并忘记重新连接时的字符集设置

问题描述:

我们最近调试了一个奇怪的错误。找到了解决方案,但解决方案并不完全令人满意。MDB2断开连接并忘记重新连接时的字符集设置

我们使用IntSmarty来本地化我们的网站,并使用我们自己的包装将本地化的字符串存储在数据库中。在其析构函数中,IntSmarty保存它可能具有的任何新字符串,从而导致数据库调用。

我们使用MDB2的Singleton实例对MySQL进行查询,连接后我们使用SetCharset()函数将字符集更改为UTF-8。我们发现由IntSmarty保存的字符串在最终插入时被解释为ISO-8859-1。我们仔细查看了查询日志,发现在IntSmarty的析构函数被调用之前,MySQL连接断开了连接。然后重新建立,但没有在新连接上发出“SET NAMES utf8”查询。这导致保存的字符串被MySQL解释为ISO-8859-1。

似乎没有选项设置MDB2上的默认字符集。我们解决这个问题的办法是改变MySQL服务器配置,将

init-connect='SET NAMES utf8' 

添加到my.cnf。这只能解决我们的字符集总是相同的问题。

那么,有没有什么办法可以防止连接在所有查询运行之前被拆除?我可以强制MDB2实例在一切之后被破坏吗?

打开持续连接的工作原理,但不是所需的答案。

从PHP5文档:

作为一个特定对象的所有引用被移除或当对象被显式销毁,或在关闭序列任何顺序析构函数方法将被立即调用。

PHP documentation

(重点煤矿)

什么是可能发生的事情是,你的脚本不明确销毁对象,所以当PHP获取到脚本的末尾就开始清理以任何顺序发生的事情 - 在你的情况下,首先关闭数据库链接。

如果您在脚本实际结束之前明确销毁IntSmarty对象,那应该可以解决您的问题。