我们最近调试了一个奇怪的错误。找到了解决方案,但解决方案并不完全令人满意。
我们使用 IntSmarty 本地化我们的网站,并使用我们自己的包装器将本地化的字符串存储在数据库中。IntSmarty 在其析构函数中保存它可能拥有的任何新字符串,从而导致数据库调用。
我们使用 MDB2 的 Singleton 实例对 MySQL 进行查询,连接后我们使用 SetCharset() 函数将字符集更改为 UTF-8。我们发现在进行最终插入时,由 IntSmarty 保存的字符串被解释为 ISO-8859-1。我们仔细查看了查询日志,发现 MySQL 连接在 IntSmarty 的析构函数被调用之前就断开了。然后它重新建立,但在新连接上没有发出“SET NAMES utf8”查询。这导致保存的字符串被 MySQL 解释为 ISO-8859-1。
似乎没有在 MDB2 上设置默认字符集的选项。我们对这个问题的解决方案是更改 MySQL 服务器配置,通过添加
init-connect='SET NAMES utf8'
到我的.cnf。这只解决了我们的字符集总是一样的问题。
那么,有什么方法可以防止在所有查询运行之前断开连接?我可以强制 MDB2 实例在其他所有操作之后被破坏吗?
打开持久连接有效,但不是理想的答案。