- 締切済み
漢字や平仮名の文字をSQLで実行するにはどうすればよいでしょうか。
先日した質問の仕方が悪かったようなので、再度質問させていただきます。 アルファベット以外の文字を書き込んで実行ボタンを押すと(下の例だと、Aの後ろに「様」といれてます。)、実行された SQL クエリーには「様」が表示されず、結果「N」や「?」というレコードが残ってしまいます。 あと、下記のメッセージが出てくる時もあります。 もしわかる方がいらっしゃれば教えて頂ければ幸いです。 コードの問題かと思い、php.iniやmy.iniで設定を行っているつもりなのですが、うまくいきません。 下記メッセージと設定内容 Warning: mb_strpos(): Unknown encoding or conversion error. in C:\apachefriends\xampp\phpmyadmin\libraries\string.lib.php on line 100 Warning: mb_strpos(): Unknown encoding or conversion error. in C:\apachefriends\xampp\phpmyadmin\libraries\string.lib.php on line 100 Warning: mb_strpos(): Unknown encoding or conversion error. in C:\apachefriends\xampp\phpmyadmin\libraries\string.lib.php on line 100 実行された SQL クエリー: INSERT INTO member( email, keitai, name, futan ) VALUES( 'ggg@ggg.com', 0, 'A', 100 ) 設定内容は、 my.ini [client] default-character-set=ujis local-infile=1 [mysqld] default-character-set=ujis local-infile=1 set-variable=lower_case_table_names=0 php.ini default_carset="EUC-JP" [mbstring] mbstring.language=Japanese .internal_encoding=EUC-JP .http_input=auto .http_output=EUC-JP .encoding_translation=Off .detect_order=ASCII,SJIS,EUC-JP,JIS,UTF-8 .substitute_character=none;
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- copymaster
- ベストアンサー率81% (83/102)
大体何が起きているかがわかりました。 (1)MySQLバージョンを4.0でなく、4.1か5.0を使用している。 (2)phpMyAdminのトップページの MySQL 接続照会順序が、"utf8_general_ci" になっている。 もしgoohajimete様の実行環境が、 上記に当てはまりましたら、おそらくこういうことです。↓ MySQL4.1以降からは、データベース、テーブル単位で、文字コードが設定できるようになりました。しかも問い合わせ時に文字コードを自動変換してくれるという機能がつきました。 phpは、my.iniを読み込みませんので、my.iniで設定された文字コードは無視されます。 では、どの文字コードがベースになるかというと、本家MySQLABのサイトからダウンロードできる4.1のWindows版は、文字コード=laten1でコンパイルされているため、なんと、laten1がベースになります。 ご指摘のINSERT文を入力すると、なぜか、Mysqlは、UTF-8(またはlaten1?)と判断し、これをEUC-JPに変換しようとします。 入力文字 → UTF-8 → EUC-JP こうして、日本語が破壊されます。 では、結論として、どうやったら良いかというと、 INSERT文の前に、 SET NAMES ujis; と入力し、つづけてSQL文をいれます。(;セミコロンを忘れずに。。。) たとえば、 SET NAMES ujis;INSERT INTO member( email, keitai, name, futan ) VALUES( 'ggg@ggg.com', 0, 'A', 100 ); というように。。。 (基本的に、われわれ日本人が、MySQL4.1以降を使用する時は、このSET NAMES ××× が付きまとうことになりそうです。 ただ、文字コードはEUC_JPしか使わず、 4.1のサブクエリなどの新機能を我慢できるのでありましたら、MySQL4.0系がもっとも安定しておりますので、 こちらをお使いになってもいかがとは思います。 ネット上の情報から察するに、 MySQL4.1では、かなり皆さん苦労されているようですので。。。
- copymaster
- ベストアンサー率81% (83/102)
Warning:が出なくなったところで、 半分解決ですね。 環境をまだお聞きして いなかったので、ご確認です。 (1)使用しているOSは?WindowsそれともLinux? (2)PHP、MySQLのそれぞれのバージョンは? (3)SQLを実行している場所は? たとえばphpMyAdminを使ってweb画面上から 実行しているのでしょうか。 もし、phpMyAdminの場合、 config.inc.phpの、言語設定が、 $cfg['DefaultLang'] = 'en-iso-8859-1'; ではなく、 $cfg['DefaultLang'] = 'ja'; になっていますでしょうか?
補足
ご質問大変有難うございます。 下記に補足いたします。 (1)windows (2)phpMyAdminでweb上より (3)'ja'に変更してます。最初はen-iso-8859-1だったので、変更ましたが、依然漢字が表示されない状態です。 何かわかりましたら教えて頂けると幸いです。
- copymaster
- ベストアンサー率81% (83/102)
php.iniの、 mbstring.encoding_translation = On でどうでしょうか?
補足
早々のご回答ありがとうございます。 しかし残念ながら、上記のように設定してみましたがうまくいかず、同様の結果になってしまいました。 (ただ、今回はエラーメッセージは出ず、 「実行された SQL クエリー: INSERT INTO member( email, keitai, name, futan ) VALUES( 'xxx@ccc.com', 0, 'A', 100 )」 と表示されます。 (Aのあとに様という漢字をつけて実行してはいますが、実行ボタンを押すとやはり様の字が抜けてしまいます。) 何か他に考えられる原因はありますでしょうか。
補足
copymaster様 詳しいご説明大変有難うございます。 また返事が送れて大変失礼しております。 バージョンを確認するだけで手間がかかっていたのですが、 お察しの通り、 phpMyAdmin 2.6.0-pl3 MySQL 4.1.8 というバージョンでした。 ただ、ご指摘のように下記のように対応しましたが、 やはりうまくいきませんでした。 SET NAMES ujis;INSERT INTO member( email, keitai, name, futan ) VALUES( 'ggg@ggg.com', 0, 'A様', 100 ); で実行してもやはり、実行してもらえず、(漢字部分の「様」が抜けて実行されしてしまいます。(下記のように) SET NAMES ujis;INSERT INTO member( email, keitai, name, futan ) VALUES( 'ggg@ggg.com', 0, 'A', 100 ); やはりバージョンを4.0にするしかないのでしょうか。 遅れた手前再度質問するのも恐縮なのですが、お時間のある時にでも教えていただけると幸いです。