mysql+phpで「~」「¬」など特定の文字だけが?に文字化けします。原因と対策方法を教えてください。



原因はたぶん、mysqlのCHARACTER SETがeucなのにutf-8に変換して格納してしてしまっているからかな?
現在set names utf-8して、すべての取り扱いをutf-8にしてしまっています。
mb_convert_encoding($str, "utf-8", "auto");ページコードもutf-8です。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/04/16 00:31:33
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:i_kumagoro No.4

回答回数170ベストアンサー獲得回数58

ポイント24pt

サーバのデフォルトの設定がいじれないという事だけでしたら、デフォルトがeucだとしてもデータベース、テーブルあるいはカラムごとにキャラクタセットを指定でます。MySQL 4.1用ですが、日本語のドキュメントもあります。

id:kuippa

そうですね。

データベースのクリエイトコマンドもssh経由では禁止されているので変更できないのですが、

テーブルにキャラコードつけておけば問題なかったのかもしれませんね。

http://dev.mysql.com/doc/refman/4.1/ja/charset-table.html

ALTER TABLE table_name DEFAULT CHARACTER SET utf-8

こんな感じかな。

いずれにしろ一回データをダンプしないとだめそうですね。

ありがとうございました。

2008/04/16 00:30:32

その他の回答3件)

id:pahoo No.1

回答回数5960ベストアンサー獲得回数633

ポイント22pt

ご利用のパッケージが MySQL 4.1 以上という前提で回答します。

default-character-set = utf8

に設定してください。手順は「MySQL で、キャラクタセットを指定してデータベースをインポートする方法」を参照してください。

MySQL側がutf-8格納設定されていれば、mb_convert_encoding($str, "utf-8", "auto"); は不要です。auto指定すると、かえって文字化けの原因になります。

mb_internal_encoding('utf-8') は指定してください。

id:kuippa

ごめんなさい注釈不足で。DBがutf-8なら問題ないです。

ただ現象のでているレンタルサーバーが残念なことにsjisかeucしか設定できないんです。


ここらへんは入ってます。

mb_language('Japanese');

mb_internal_encoding('UTF-8');

mb_http_output('UTF-8');

2008/04/10 18:41:37
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント22pt

ただ現象のでているレンタルサーバーが残念なことにsjisかeucしか設定できないんです。

MySQLがsjisかeucしか設定できないということですね。

それであれば、MySQLをeucに設定し(PHPはsjisで不具合が出ることがあるので)、

HTML/PHP も euc-jp で統一するのが無難です。


どうしても HTML/PHP 側を utf-8 にしなければならないのであれば

mb_convert_encoding($str, 'euc-jp', 'utf-8') で MySQL 用のデータを生成し、

MySQLから受け取ったデータは mb_convert_encoding($str, 'utf-8', 'euc-jp') でデコードしてください。

id:kuippa

一応ページコードはutf-8からは動かしたくないです。

mb_convert_encoding($str, 'euc-jp', 'utf-8')逆かな?


そうですね。。。

やはりこれが一番の近道ですか。。。

configで弄れるようにしておいたのですが、動いているようだったので気がつきませんでした。

次回のメンテのときにでもダンプして差し替えを試みます。

2008/04/11 10:32:24
id:ken33jp No.3

回答回数928ベストアンサー獲得回数13

ポイント22pt

>特定の文字だけが

DBに格納する前に、特定の文字だけを別の文字に変換して格納。

取り出すときは、逆の操作をして、元の文字列に戻す。

HTMLユニコードに変換してもよいかも。

http://code.cside.com/3rdpage/jp/unicode/converter.html

id:kuippa

~とかですかね。

http://anond.hatelabo.jp/ とかでも同様の現象が放置されてますけどユーザーが入力により回避してますね。

どこかに化ける一覧とかないでしょうか。

んー。

2008/04/11 10:40:06
id:i_kumagoro No.4

回答回数170ベストアンサー獲得回数58ここでベストアンサー

ポイント24pt

サーバのデフォルトの設定がいじれないという事だけでしたら、デフォルトがeucだとしてもデータベース、テーブルあるいはカラムごとにキャラクタセットを指定でます。MySQL 4.1用ですが、日本語のドキュメントもあります。

id:kuippa

そうですね。

データベースのクリエイトコマンドもssh経由では禁止されているので変更できないのですが、

テーブルにキャラコードつけておけば問題なかったのかもしれませんね。

http://dev.mysql.com/doc/refman/4.1/ja/charset-table.html

ALTER TABLE table_name DEFAULT CHARACTER SET utf-8

こんな感じかな。

いずれにしろ一回データをダンプしないとだめそうですね。

ありがとうございました。

2008/04/16 00:30:32
  • id:gekikawa
    ところで文字化けはDBから出すと生じるのでしょうか?
    それともDBへ入れた時点で発生しているのでしょうか?
    (でもそれを確認する術がないかな?)

    特定の文字で化けると言う事なので、
    mysql_real_escape()あたりを使ってみては如何でしょうか?
  • id:kuippa
    ssh経由でeucでつないでデータをeucでいれるぶんには文字化けしないので、いれるだんかいで文字化けしているとおもいます。


    show variables like "char%";

    +--------------------------+---------------------------------------------------+
    | Variable_name | Value |
    +--------------------------+---------------------------------------------------+
    | character_set_client | latin1 |
    | character_set_connection | latin1 |
    | character_set_database | ujis |
    | character_set_filesystem | binary |
    | character_set_results | latin1 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | /usr/local/mysql-src-5.1.22/share/mysql/charsets/ |

    厳しいですね…。
  • id:i_kumagoro
    デフォルトの設定は変えずにデータベースのキャラクタセットだけutf-8に変えてもいけないのですか?
  • id:kuippa
    データベースのキャラクタセットってcharacter_set_databaseのことでしょうか?
    それともテーブルごとに文字コードを振るとか?


    utf-8でDBつくれればそれが一番問題のないやりかただとは思います。
    事実そのような形式で運用していれば問題ありません。


    ただ今回はレンタルサーバーなのでutf-8でつくれないんです。
    サーバースクリプトで変換するのってできましたっけ?
    set namesみたいに。。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません