【问题标题】:MDB2 disconnects and forgets charset setting when reconnectingMDB2 断开连接并在重新连接时忘记字符集设置
【发布时间】:2008-09-18 13:47:57
【问题描述】:

我们最近调试了一个奇怪的错误。找到了解决方案,但解决方案并不完全令人满意。

我们使用 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'

到 my.cnf。这只解决了我们的字符集总是一样的问题。

那么,有什么方法可以防止在所有查询运行之前断开连接?我可以强制 MDB2 实例在其他所有操作之后销毁吗?

打开持久连接有效,但不是理想的答案。

【问题讨论】:

    标签: php mysql pear mdb2


    【解决方案1】:

    来自 PHP5 文档:

    一旦对特定对象的所有引用被删除或对象被显式销毁或以关闭顺序中的任何顺序,将立即调用析构函数。

    PHP documentation

    (强调我的)

    可能发生的情况是您的脚本没有显式销毁该对象,因此当 PHP 到达脚本末尾时,它会以任何感觉的顺序开始清理东西——在您的情况下,是关闭首先是数据库链接。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2010-10-29
      相关资源
      最近更新 更多