我們最近調試了一個奇怪的錯誤。找到了解決方案,但解決方案並不完全令人滿意。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實例在一切之後被破壞嗎?
打開持續連接的工作原理,但不是所需的答案。