先日、お客さんから「システムを開いたら文字が全部 “?” になっている」と連絡を受けて調査したところ、エックスサーバー(XSERVER)の「ハードウェア大幅増強・最新サーバー環境への移行メンテナンス」が原因であることが分かり、解決策を一日かけて調べたわけです。
障害の状況
システムはSmartyで作られていました。
そのシステムを作った人はもう社内にはいないし、社内にプログラマーはいないので、何がどうなってアレなのか一から考えないとわからなかったのです。
そのメンテナンスでは、MySQL5.5がMariaDB5.5へ移行されてしまいました。
ただ、注意書きに下記のような記述がありました。
※「MariaDB5.5」は「MySQL5.5」から派生したデータベースソフトウェアです。
「MySQL5.5」との完全な互換性を持ちつつも速度や安定性が向上しており、現在ご利用中のデータベースをそのまま、より安定した環境でご利用いただくことが可能です。
だから関係ないと思っていましたが、どうやらこれが原因だったのです。
エックスサーバーからの解決策案内
その当日、早々にエックスサーバー(XSERVER)へ問い合わせを送っていました。
Smartyを使ったシステムであること、データベースから引っ張ってきた文字が “?” になること、解決策を提示してほしい、ということを書きました。
5時間後くらいに返ってきた返答がこちら。
MySQLデータベースからWEBサイトにデータを出力する場合に
文字コードを厳密(正確)に指定されていないと文字化けが発生するよう、
サーバー側の仕様が変更されております。他にも、[.htaccess]の解釈も厳密になっておりますが
これはより安定したサーバー運用のための仕様変更でございますこと
ご了承くださいますようお願い申し上げます。
恐れ入りますが、サーバーパネル「php.ini設定」から
以下のようなPHPでの文字コードに関しての設定を見直していただくなど
ご対応いただけますでしょうか。
————————————
mbstring.language
mbstring.internal_encoding
mbstring.http_input
mbstring.http_output
mbstring.encoding_translation
mbstring.detect_order
mbstring.substitute_character
————————————
または、PHPプログラムの方で
【mysql_set_charset(“utf8”);】などと
文字コードを指定することで、文字化けが解消されるかなども
合わせてお試しいただければと存じます。
php.iniの変更、[mysql_set_charset()]での指定を
お試しいただいても問題が改善しない場合は、
データベースを一度エクスポートしたものを
改めてインポートし直していただくことで文字化けが解消することもあるようでございますので、
可能ならお試しいただければと存じます。
ここに書かれている解決策は3つあります。
- php.iniの設定で文字コードを正確にする
- mysql_set_charset(“utf8”);を記述する
- データベースをインポートし直す
結局どうやって解決した?
とりあえず、その3つを上から順に試してみましたが、まず文字コードは正確に書かれていたし、どれも解決には至りませんでした。
MariaDBだから動かないのでは…?
なんとなくそんな気がして、MySQL5.7で新しいデータベースを作り、そちらに移行したところ、うまく動いたのです。
その結果をエックスサーバーにも伝え、今後の解決策の1つに入れてはどうかと提案したところ、「データベースをインポートし直す」という案内はしましたよ、という旨の返信が返ってきたので、あ〜そうですか、もう知らねぇよと思いました。
エックスサーバーに、この記事を紹介しておきました。
「こちらの記事の方が役に立つ!!」とね。
ありがとうございます。
営業妨害だって言われたらどうしよう!
エックスサーバー利用者で、とても好きなので、改善していってほしいですね。
はじめまして、そしてよい情報ありがとうございました。
私も同じ状況になり困っていましたが原因追求めんどうだったのでDBのバージョンアップしたら無事なおりました。
この情報がなければずっと悩んでいたと思います、ほんとうにありがとうございました!
こちらこそ、わざわざご報告頂きありがとうございました!
こちらの記事を拝見し、「MySQL5.7で新しいDBを作りそちらに移行」という方法で無事に解消されました。
ありがとうございました!
解消されてよかったです!ご報告ありがとうございます♪
初めまして。
自分も同じ対応でしたがそもそも接続がPDOだったため2を試すことが出来ませんでした。
が、PDO接続時に
charset=UTF8
をセットすることで解決できました。
1はもとに戻しても問題ありませんでした。
エックスサーバーの「ハードウェア大幅増強・最新サーバー環境への移行メンテナンス」でこのページが最初に見つかったので他にも同じ症状でハマる人が一人でも早く解決できたら良いなと思いコメントしました。
ぴよん様
情報ありがとうございます。
他に悩んでいる方のお役に立てると良いです♪