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

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

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

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

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

4回答

7474閲覧

mysqlで既に文字化けしているものをphpで正常に表示させたい

memo

総合スコア17

MySQL

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

PHP

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

4クリップ

投稿2015/12/17 12:08

編集2015/12/28 04:20

表題の件ですが、
DBを直すのが早いと思われるのですが、PHPでの表示のさせ方をご教授頂けますと幸いです。
サーバはロリポップのレンタルサーバとなります。
mysqlはUTF-8でPHPもUTF-8です。
オープンソースの顧客管理システムと、
自分で開発したツールを連携させたいのですが、
顧客管理システムでのデータが下記のように文字化けしております。
ななし
こちらを日本語表示させたいのと文字コード等も教えて頂けますと幸いです。
また、一行だけですのでmb_convert_encoding()のような関数のような簡単に変換できる方法をご教授頂けますと幸いです。
よろしくお願い致します。

その後。。。。
どうやら
mysql_set_charset("utf8");

mysql_set_charset("utf-8");
に(ハイフン入れる)すると正常に表示されるようですが、

そのまま
mysql_set_charset("utf-8");
の設定でDBにUPDATE文を投げるとあのような文字化けをしてしまうようです。

utf-8に合わせるとDB側が文字化けをしてしまうのでどうしたもんか。。。

マークダウンもろくに使えずに申し訳御座いません。

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

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

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

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

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

guest

回答4

0

ベストアンサー

select hex(..) した場合の文字化けのパターンから http://www.gcd.org/blog/2009/09/177/ で紹介されている誤ってUTF-8の文字列をclientのcharacter setの設定をlatin1にして書き込んで変に変換されてしまった状態であると考えられます。

SQL

1CREATE TABLE `t1` ( 2 `id` int(11) NOT NULL DEFAULT '0', 3 `message` text CHARACTER SET utf8, 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB DEFAULT CHARSET=latin1

PHP

1<?php 2 3$user = 'user'; 4$pass = 'pass'; 5 6$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 7 8$pdo->exec('set names latin1;'); // わざと間違えた状態にします。 9 10$sth = $pdo->prepare('insert into t1(id, message) values (:id, :message);'); 11$param = [ 12 ':id' => 1, 13 ':message' => 'ななし', 14]; 15$sth->execute($param);

上記のようなテーブルを用意してテスト用のプログラムを実行すると確かに同じ文字列が挿入されます。

text

1mysql> select * from t1; 2+----+---------------------+ 3| id | message | 4+----+---------------------+ 5| 1 | ななし | 6+----+---------------------+ 71 row in set (0.00 sec) 8 9mysql> select id,hex(message) from t1; 10+----+----------------------------------------+ 11| id | hex(message) | 12+----+----------------------------------------+ 13| 1 | C3A3C281C2AAC3A3C281C2AAC3A3C281E28094 | 14+----+----------------------------------------+ 151 row in set (0.00 sec)

従って、同じようにclient側の状態を間違ってlatin1にしてやれば、この逆の変換が行われて元と同じデータが読み出されます。

PHP

1<?php 2 3$user = 'user'; 4$pass = 'pass'; 5 6$pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 7 8$pdo->exec('set names latin1;'); 9 10$sth = $pdo->prepare('select id, message from t1 where id = :id;'); 11$param = [ 12 ':id' => 1, 13]; 14$sth->execute($param); 15$row = $sth->fetch(); 16printf("%d, %s\n", $row['id'], $row['message']);

text

1$ php test2.php 21, ななし

同じやり方で無理矢理読み出すことは出来ると思います。

ただあきらかに間違った形でデータが格納されている状態ですので、顧客管理ソフトウェアの方の誤った文字コードの設定になっている問題を解決してからDBの中身も修正してきれいな状態にするのが本来は望ましいと思います。

投稿2015/12/28 05:37

crhg

総合スコア1175

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

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

memo

2015/12/28 06:30

ご連絡ありがとう御座います。 UTF-8ではなくlatin1にしたところ見事表示されました! 再現コードまで頂きましてありがとう御座います。 仰るとおりDBの中身を直さなくてはいけませんよね。 表題通りのお答えなのでベストアンサーとさせて頂きます。 またその他のお答え頂けた皆様もこちらからで大変恐縮ではありますが、 ありがとう御座いました。
guest

0

mysqlに入って以下を直接実行してもだめでしょうか?

mysql>alter table messages default charset=utf8;

投稿2015/12/28 04:36

shotakeu

総合スコア386

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

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

memo

2015/12/28 04:45

ご連絡ありがとう御座います。 上記実行すると #1146 - Table 'LAA0******-*****.messages' doesn't exist と出てしまいます。 ロリポップの共有サーバのために許可されていないものかと思われます。
memo

2015/12/28 04:49

あ、messagesはテーブル名ですね、 テスト環境にてやってみます。
memo

2015/12/28 04:53

`mysql>alter table テーブル名 default charset=utf8;` を直接実行後にwebアプリより日本語入力しましたがやはり文字化けの状態となりました。
guest

0

他の方もおっしゃっている通り、DBを直すのが間違いないです。

が、もし単なる文字コードの問題で表示さえできれば取り急ぎOKであれば以下の関数をお試しください。
文字コードを判別して返します。

PHP

1function hoge($str){ 2 foreach(array('UTF-8','SJIS','EUC-JP','ASCII','JIS') as $charcode){ 3 if(mb_convert_encoding($str, $charcode, $charcode) == $str){ 4 return $charcode; 5 } 6 } 7 8 return null; 9}

投稿2015/12/17 14:41

編集2015/12/17 14:42
aleksey

総合スコア56

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

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

memo

2015/12/18 01:12 編集

おはようございます。 只今電車のため後で試させていただきます。 有り難うございます。
memo

2015/12/18 01:48

頂いている関数を試してみました。 やはりUTF-8と表示されます。 説明が下手で申し訳ないのですが、 顧客管理ツールでデータの更新と表示は文字化け無しですが、 そもそもの元データがmysql上で文字化けしております。 その為顧客管理ツール上で文字コードを書き換えて戻したりと悪さをしているということが判るのですが、現状運用中のツールなのでDBを弄りたくないのが事実です。 仰るとおり取り合えず正常な表示が出来ればOKとなります。 お手数をお掛け致しますが何卒よろしくお願い致します。
aleksey

2015/12/18 02:11

ソースとコンフィグを見てみないとなんともいえませんが、ここら辺が参考にならないですか? http://wordpress.honobono-life.info/svrmng/mysql%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%80%81%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%80%81%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%80%81%E3%82%AB%E3%83%A9%E3%83%A0/ 可能であれば簡単な検証環境を作ってDBを弄ってみるのが近道かと思います。 単に文字コードの問題だけであれば、該当のカラムに入っているデータの正しい文字コードがわかれば変換してクライアントに返す処理で良さそうなのですが・・・。 認識が違っておりましたら申し訳ございません。
memo

2015/12/18 04:03

顧客管理システムはこちらのものをお借りしております http://customer.limitlink.jp/ また文字化け対策としてあるページが有るのですが、 http://l-groupware.com/support/charset.html 設定としては同じでした。 ブログ記事ありがとう御座います。 レンサバの為、my.cnfが弄れないようでして、、 SHOW CHARACTER SET; では Charset|Description|Default|collation utf8|UTF-8|Unicode|utf8_general_ci となっております。 >>該当のカラムに入っているデータの正しい文字コード 仰るとおりこちらが判れば私の方でも対処可能だと思っているのですが、 初めに頂いた関数の通りUTF-8と表示されているものなので、 ななし 自体が何の文字コードが判ればと思っております。 何卒よろしくお願い致します。
crhg

2015/12/25 01:17

SHOW CHARACTER SET; はどういう文字集合をサポートしているかの一覧が出るだけで、サーバ・クライアント間の通信などでどう変換するかを調べるには SHOW VARIABLES LIKE 'CHAR%'; 等としてcharacter_set_client,character_set_connection,character_set_resultsがどう設定されているかを確認する必要があります。 また、DBに格納されている文字コードがどうなっているかは化けた後の結果から推測するのは難しいので SELECT HEX(文字化けするカラム) FROM 〜 で入っているデータを16進数表示させそこから調べていくのが良いです。 こちらが参考になると思います http://www.gcd.org/blog/2009/09/177/
memo

2015/12/25 05:06

crhg様 ご連絡ありがとう御座います。 SHOW VARIABLES LIKE 'CHAR%'; を実行しますと |Variable_name | Value | |character_set_client | utf8 | |character_set_connection | utf8 | |character_set_database | utf8 | |character_set_filesystem | binary | |character_set_results | utf8 | |character_set_server | utf8 | |character_set_system | utf8 | |character_sets_dir | /usr/share/mysql/charsets/ | と表示されます。 >>SELECT HEX(文字化けするカラム) FROM 〜 については「ななし」のデータは「C3A3C281C2AAC3A3C281C2AAC3A3C281E28094」と出ましたのです。 こちらの件については少々調べてみます。 また進捗としてはphpでutf8_decode()関数を使いますと、 例えば「ななし」というデータが「なな縺?」とまで出るようになったのですが、 まだ文字化けしてしまっている状況となりまして、 htmlソースで<meta charset="utf-8">と設定しているのですが、 ソースを確認するとshift-jisで表示されてしまいます。、 データ自体にUTF-8とShift-jisが混在しているような気がしております。 一度バイナリデータ等何かに変換したものを再度正常に変換して表示出来るようにとも考えておりましたが、 頭が回りません。 こちらのサイト様では正常に表示されたものが出るのでまだやり方があると思っております。 http://ltside.com/enc/ ご回答ありがとう御座います。
guest

0

DBを直すのが早いと思われるのですが、

その通り、元のデータを直すのが定石です。元データが外字や機種依存文字 だったりしませんか?
元データの本来の内容は?文字化けした内容を表示されても、元データの本来の内容がわからないのに掲示版で質問されても対応は難しいかと。

投稿2015/12/17 12:36

Orlofsky

総合スコア16415

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

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

memo

2015/12/18 01:07

おはようございます 外字や機種依存文字は使っておらず ãªãªã— の 元のデータは ななし となります 携帯から返信のため見辛くて申し訳ありません。
Orlofsky

2015/12/18 01:50

文字化けは1件だけということですから、プログラム側で ãªãªã— だったら ななし に変換されては? 同じような文字化けが起きないよう、だれがどこからどうやって入れたデータなのか文字化けの原因は調べて対応されたほうが良いでしょう。
memo

2015/12/18 03:59 編集

説明不足で申し訳有りません。 一件ではなく日本語で入力されたもの全てが文字化けしている状態となります。 こちら判定する記述など御座いますでしょうか?
memo

2015/12/18 04:09

ごめんなさい >>一行だけですので とは取り出すのは一行だけという意味でした。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問