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

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

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

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

PHP

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

Q&A

解決済

4回答

1170閲覧

文字化けして困っています。

rakuno-gyunyu

総合スコア9

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/07/04 13:55

PHPでシステムを作っています。
HTML内の文字は文字化けせずに表示されるのですが
mySQLから取り出した日本語が文字化けしてしまいます。
文字コードはUTF-8で出来るだけ合わせているつもりです。
この文字化けを直すにはどうしたらよいでしょうか?

以下コード(gyunyu.php)

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <p>ほげほげ</p> <?php header("Content-Type: text/html; charset=UTF8");
$host = 'localhost'; // 利用するデータベース $dbName = 'xxxxxxxxxx'; // MySQLの DSN 文字列 $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8"; // phpmyadminのユーザー名とパスワード $user = 'xxxxxxxxx'; $password = 'xxxxxxxxxxxxx'; $pdo = new PDO($dsn, $user, $password); // プリペアドステートメントのエミュレーションを無効にする $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // 例外がスローされる設定にする $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT * FROM Site_Plan2"; $stm = $pdo->prepare($sql); $stm->execute(); $result = $stm->fetchAll(PDO::FETCH_ASSOC); print_r($result); ?> </body>
</html>

出力された文字はこちらです。
ほげほげ
Array ( [0] => Array ( [No] => 1 [Meal] => ?? [RoomType] => E [HTML] => ??? ) )

配列内のMealとHTMLに入っている値が文字化けしています。
レンタルサーバーはOCNのメール&ウェブを使っています。
PHPバージョンは5.3
MySQLバージョンは5.5.54

いろいろなサイトを見てUTF-8にしてみました。
以下はmySQL内の文字コードです。
SHOW VARIABLES LIKE 'character_set_%'

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8mb4(もしかしてここが問題?)
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

utf8mb4となっているところが問題かなと思っているのでがここを変更するのは
怖くてできていません。(システムで使用中)

下記はテーブルの文字コード
SHOW TABLE STATUS FROM tablename LIKE 'Site_Plan2'
Collation は utf8mb4_general_ci となっていました。

Httpヘッダーも調べてみましたが
Content-Type: text/html; charset=UTF8
となっていて問題ないと思います。
Httpヘッダーを調べたときに使ったのはFireFox用のアドオンで
Live HTTP Headersというものです。

その他、C#のプログラムから先ほどのテーブル(Site_Plan2)からデータを取り出しましたが
こちらは文字化けしておりません。

長くなってしまいましたがどうかお助けください。

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

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

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

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

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

guest

回答4

0

utf8mb4が変更できないのであれば、むしろutf8mb4に統一すればよいかと。
ただ、現象を考えると、問題はそこじゃない気はします。。。

投稿2017/07/05 00:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rakuno-gyunyu

2017/07/05 01:09

回答ありがとうございます。 後々は utf8mb4 に統一しようと思っていますが 今はその他の方法で解決出来ないかと調べているところです。 ご指摘ありがとうございました。
guest

0

ベストアンサー

本来はお勧めしませんが、おまじないでいかオプションを追加してみて下さい

PHP

1 $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); 2

(new PDOを宣言したあとならOK)

投稿2017/07/05 00:15

yambejp

総合スコア114779

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

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

rakuno-gyunyu

2017/07/05 00:37

回答ありがとうございます。 下記のコードの後に $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); と入れてみましたが ほげほげ Array ( [0] => Array ( [No] => 1 [Meal] => ?? [RoomType] => E [HTML] => ??? ) ) と出て出力結果は変わりませんでした。 他にも何か解決方法はありますか? どうぞよろしくお願い致します。
yambejp

2017/07/05 00:44 編集

では、もうひとつテスト $sql = "SELECT * FROM Site_Plan2"; の前に $pdo->query("SET NAMES utf8"); してみてはどうでしょうか?
rakuno-gyunyu

2017/07/05 01:21

回答ありがとうございます。 $pdo->query("SET NAMES utf8"); 上のコードを $sql = "SELECT * FROM Site_Plan2"; の前に入れたところ文字化けがなくなりました。 本当にありがとうございました。 コードについてなのですが下記のコードは $pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND,'SET NAMES utf8'); お勧めしないとのことでしたが $pdo->query("SET NAMES utf8"); このコードは使用しても問題ないのでしょうか? どうぞよろしくお願い致します。
yambejp

2017/07/05 01:39

「SET NAMES utf8」自体がセキュリティ上好ましくないようです ただ背に腹は変えられないときはつかいます。 こまかくデバッグしていけば修正箇所がみつかるかもしれないので それまでの代用手段程度にご理解ください
yambejp

2017/07/05 03:33

my.iniの [mysql] default-character-set = utf8 あたりでしょうかね、逆にこれを変えたくないならSETを発行するしかないかもしれません
rakuno-gyunyu

2017/07/05 08:02 編集

こちらの方で調べた結果一応解決しました。 $host = 'localhost'; // 利用するデータベース $dbName = 'XXXXXX; // MySQLの DSN 文字列 $dsn = "mysql:host={$host};dbname={$dbName};charset=utf8"; // phpmyadminのユーザー名 $user = 'XXXXXX'; $password = 'XXXXXX'; $pdo = new PDO($dsn, $user, $password); 上記コード内の charset=utf8 が無視されていた為、文字化けしていたようです。 レンタルサーバー(OCN)のPHPをバージョンアップ(5.3から5.6)したら文字化けがなくなりました。 5.3.6 より前のバージョンでは charset は無視されていたそうです。 URLはこちらです。http://php.net/manual/ja/ref.pdo-mysql.connection.php いろいろ教えて頂き参考になる点がいっぱいあり本当にありがとうございました。 また何かありましたらよろしくお願いいたします。
guest

0

HTML も MySQL も utf8 であるならば、あとは PHP の出力エンコードが utf8 になってないとか?

試しに <?php echo "ほげほげ">
を埋め込んで、正しく「ほげほげ」と出力されるでしょうか?

投稿2017/07/05 01:24

tacsheaven

総合スコア13703

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

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

rakuno-gyunyu

2017/07/05 03:33

回答ありがとうございます。 下記のコードは文字化けせずに出力されます。 <?php echo "ほげほげ"> どうもありがとうございました。
guest

0

show create table 'table_name';で、文字化けしているテーブルの文字コードも見てみて下さい。
「UTF8に合わせました」ということで、後から変更されたのだと思いますが。
そうするとTableのCreateTable時にはまだlatinとかなんか別の文字コードだったんじゃないかなと思います。
そのままデフォルトの文字コードでvarcharとかのカラムを作ると、デフォルトの文字コードのままカラムが出来てしまいますので。
テーブル側の文字コードを確認し、必要があれば修正して下さい。

投稿2017/07/04 14:25

kunai

総合スコア5405

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

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

rakuno-gyunyu

2017/07/04 15:42

回答ありがとうございます。 show create table Site_Plan2; で文字コードを調べてみましたが utf8mb4 となっていました。 CREATE TABLE `Site_Plan2` ( `No` int(11) NOT NULL, `Meal` varchar(20) NOT NULL, `RoomType` varchar(10) NOT NULL, `HTML` varchar(10000) NOT NULL, PRIMARY KEY (`No`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 utf8mb4はUTF-8と同じと思っていたのですが、やはり合わせないと 文字化けしてしまうのでしょうか? どうぞよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問