質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

1350閲覧

PHP7.1でMySQLの文字化けをなくしたい

schwarzewald

総合スコア18

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/03/23 06:03

PHP5.3.3からPHP7.1に移行しようとしているのですが、その際にMySQLの文字化けが治らず困っています。

MySQLのバージョンは5.1.73-logなのですが、最初に照合順序をlatin1_swedish_ciで作ってしまった後、utf8_general_ciに修正したのですが、現行環境のPHP5.3.3からアクセスした時のみ正常に表示されるものの、ターミナルやphpMyAdminから表示したら文字化けします。
イメージ説明

下記のようなのコードだとPHP5.3.3環境下での出力結果はこうなりますが

ダミーテキスト

PHP7.1.15だとこうなります

ダミーテキスト

PHP

1<? 2define("MYSQL_SERVER", "ip.add.re.ss"); 3define("MYSQL_DATABASE", "database"); 4define("MYSQL_USER", "user"); 5define("MYSQL_PASS", "pass"); 6 7// データベースに接続する 8try{ 9 $pdo = new PDO("mysql:dbname=".MYSQL_DATABASE.";host=".MYSQL_SERVER , MYSQL_USER, MYSQL_PASS); 10} 11catch(PDOException $e){ 12 die("<h3>データベース接続エラー</h3>"); 13} 14 15$sql = "SELECT `subject` FROM `page` WHERE `id`=1"; 16$st = $pdo->prepare($sql); 17$st->execute(); 18$row = $st->fetch(); 19 20echo $row['subject']; //このカラムの中身は「ダミーテキスト」 21?>

pdo接続でPHP7.1.15などの環境下でも文字化けしないようにするにはどうすればいいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/03/23 06:12

DBをutf8_general_ciで作り直してデータを移行するというのは考えてないですか?
schwarzewald

2018/03/23 06:33 編集

phpMyAdminで一度照合順序をutf8_general_ciに変更しても変わらなかったのですが、それとは別に新しくDBを作ってそこにデータを移し替えるということでしょうか?既にDBの中身が50GB近くあるのでちょっと難しいかなと…
m.ts10806

2018/03/23 06:59 編集

なるほど。おおよそ原因が明らかであるため、原因探ってコードでなんとかするより新しくDB作って移し変えて向き先だけ変えたほうが早くに解決するとは思ったのですが、そう簡単でもない感じですね。
schwarzewald

2018/03/23 07:05

最終的にはそうするしかないかなという感じですが、現在稼働中のシステムなのでどうやって移行するかが問題ですね…
guest

回答3

0

更に追記です。
PHP5.3.6以降の環境で文字化けしたデータベースに接続する方法も分かりました。
SET NAMES latin1を指定してやれば文字化けせずにブラウザ上で表示することが出来ました。

PHP

1$mysql_options = array( 2 PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES latin1', 3); 4 5// データベースに接続する 6$spdo = new PDO("mysql:dbname=".MYSQL_DATABASE.";host=".MYSQL_SERVER , MYSQL_USER, MYSQL_PASS,$mysql_options); 7

投稿2018/04/10 03:39

schwarzewald

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

その後の顛末を報告します。
結局元のデータベースの文字化けを解決した方が良さそうなので解決策を探したところ、こちらの方法が見つかりました。
https://portalshit.net/2016/11/06/salvage-content-from-broken-mysqldump

結論から言えば、この通りに試してみたところ文字化けの大半は解決しました。
ただ、途中に絵文字などの4バイト文字が含まれているフィールドがその文字から先が消えてしまうなどの事態が発生してしまいました。

この方法を使う場合は一度mysqldumpしてから文字コードや照合順序をutf8mb4に変更した上でutf8mb4に対応したMySQLにリストアした上で行った方がいいかもしれません(それでエラーが発生しないのか未検証ですが…

投稿2018/04/09 10:23

schwarzewald

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/09 10:41 編集

utf8mb4 にした上で、スクリプト側の対応も必要。
guest

0

両方のバージョンのphp.iniで比較してみると何かわかるかもしれません。
例えば、

default_charset
mbstring.internal_encoding
mbstring.language

あるいはデータベースとのやり取り上のことであれば、
MySQLとPDOの組み合わせでcharsetを指定する - Qiita
を参考にPDO接続する際にcharset指定してみるとか。

また、照合順序の変更に関しては
MySQLの照合順序を修正する - Qiita
みたいな話もありますがここはOKでしょうか。

なお、質問文で示された文字化けの仕方は、
UTF-8(BOMなし)で「ダミーテキスト」をファイル保存したものを、
西ヨーロッパ言語(コードページ1252、iso-8859-1)として扱っているようです。
参考になるでしょうか。

投稿2018/03/23 08:20

編集2018/03/23 08:28
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

schwarzewald

2018/03/23 09:48

ありがとうございます。 php.iniについては、default_charsetの記述に以下のような違いがありました。 5.3.3 ; PHP's default character set is set to empty. ; http://www.php.net/manual/en/ini.core.php#ini.default-charset ;default_charset = "iso-8859-1" 7.1.15 ; PHP's default character set is set to UTF-8. ; http://php.net/default-charset ;default_charset = UTF-8 どちらもコメントアウトされていて指定されていないようですが、デフォルトでは5.3.3が無指定、7.1.15の方がUTF-8という違いがあることが分かりました。 そこでdefault_charset = UTF-8にしてみたり空欄にしてみたりしましたが、結果に変化はありませんでした。 他の二項目は両方とも mbstring.internal_encoding = UTF-8 mbstring.language = Japanese でした。 それからPDO接続の際のcharset指定もやってみましたが変化はなく、照合順序も以前変更した時にすべてutf8_unicode_ciに変更していました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問