• ベストアンサー

SET NAMESは文字化け? 使わない方が良い?

・リンク先で下記のように書かれているのですが、SET NAMESは使わない方が良いでしょうか? ・SET CHARACTER SETなら良いでしょうか? ・.cnfを使用しない場合は、直接指定も可? >SET NAMES だとMySQLサーバには charset が伝わるけれどクライアント側は latin1 のままなのでエスケープ処理で問題が出る可能性があります http://qiita.com/ngyuki/items/d88a4df860abb51eb714

  • re97
  • お礼率80% (601/744)
  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.3

以前にも貼ったと思いますがもう一度w http://qiita.com/mpyw/items/b00b72c5c95aac573b71#3-1 5.3.5より古いバージョンを使っていること自体にもう問題があるといっても過言ではないですね。最新リビジョンの5.3.29に更新すべきです。というよりも根本的にマイナーバージョンで見て、5.3系のサポートは切れているので使うべきではありません。5.4以降を使いましょう。5.6または5.5がおすすめです。 ここからは記事の内容と重複しますが一応… ・「SET NAMES」「SET CHARACTER SET」を使ってもデフォルトの「latin1→UTF-8」のケースではエスケープ漏れが発生することはありません。ngyukiさんが心配されていますが問題ありません。但し、ソースからビルドしている場合で、コンパイルオプションにてデフォルトの文字セットを「cp932(Shift_JIS)」に変更している場合は脆弱性となります。 ・「SET NAMES」はMySQLに送る文字列にのみ作用しますが、「SET CHARACTER SET」は送る文字列に加え送られてくる文字列にも作用します。処理が重めになるので使わない方がいいです。

re97
質問者

お礼

回答ありがとうございました。 >5.3.5より古いバージョンを使っていること自体にもう問題があるといっても過言ではないですね ・あまり意識していなかったのですが、5.3ってそういう扱いなんですね ・古いバージョンを使用し続ける理由もないので、(先ずは)PHP5.4へ上げました ・いつかはバージョンアップしなければいけないと思っていたので、いい機会になりましたー

その他の回答 (3)

noname#244856
noname#244856
回答No.4

一つ重要なことを書き忘れました。 PDO::ATTR_EMULATE_PREPARES このオプションをFalseに設定している場合は先ほど危険と説明したケースにおいても安全です。デフォルトはTrueなのでご注意を。

re97
質問者

お礼

補足ありがとうございましたー

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

なお「文字化けする」なら(対処しないといけないことがわかるので)まだマシです。 怖いのは『適切な(文字セットまで加味した)エスケープが行われない』ことによって、セキュリティホールとなってしまうこと。文字化けせずに表示出来れば何も問題がないというものではありません。

re97
質問者

お礼

回答ありがとうございましたー

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

phpスクリプト側の話ですよね(MySQLサーバ側の設定は不問とします)。わざわざset namesやset character set を使う意味はありません。 php5.3.6以降でPDO接続を使うなら、DSNで指定するべきです。 http://www.php.net/manual/ja/ref.pdo-mysql.connection.php MySQLiならmysqli_set_charsetですね。 http://www.php.net/manual/ja/mysqli.set-charset.php #ネイティブなMySQL関数はすでに非推奨なので割愛ww

re97
質問者

お礼

回答ありがとうございましたー

関連するQ&A

  • ODBC接続で全角文字が文字化け

    MySQL⇒MS-ACCESSのODBC接続で文字化けが発生してます。 ■MySQL 5.0.27 ■MyODBC 3.51.19 ■MS-ACCESS 2000 (Windows2000) ○my.cnfの設定 [mysqld] skip-character-set-client-handshake [mysqld_safe] skip-character-set-client-handshake [ODBC] default-character-set=sjis [client] default-character-set=sjis ○status Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 ▽試したこと ・Initial Statement に set names 'sjis' を設定 ・Character Set sjis、ujis、latin1 それぞれを指定 半角文字は大丈夫ですが、全角文字になると「??????????」と表示されています。 MySQL+PHPでは問題なく使えます。 解決方法分かる方アドバイスお願い致します。

    • ベストアンサー
    • MySQL
  • phpMyadminの文字化けについて

    PHPでINSERTしたものをphpMyadminで確認すると 日本語が文字化けしています。 コマンドプロンプトでテーブルを見てみると文字化けは起こっていません。どこを変えればいいのでしょうか? いろんなサイトを参考にmy.iniを直してみてもだめでした。 ----- my.ini ------ [mysqld] default-character-set = utf8 skip-character-set-client-handshake character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 skip-character-set-client-handshake [mysqldump] quick max_allowed_packet = 16M default-character-set = utf8 [mysql] no-auto-rehash # Remove the next comment character if you are not familiar with SQL #safe-updates default-character-set = utf8 ----- phpMyadmin ----- テーブルの照合順序 utf8_general_ci mysql> \s Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 バージョンは以下のとおりです。 XAMPP 1.7.1 MySQL 5.1.33 PHP 5.2.9 phpMyadmin

    • ベストアンサー
    • MySQL
  • MYSQLでの文字化け

    php(utf-8)を使ってmysqlで簡単なサイトを作ってみましたが, 日本語をフォームから入力して、表示するとき、ブラウザではまったく問題ないのですが、 phpMYadminでデータベースを開くとの日本語部分が文字化けして読めません。 ローカルでは問題ないので、サーバーの問題かとおもい、 他のサーバー(ロリポップ)にphpとsqlをテストでコピーしてみましたら大丈夫でした。 何かの設定かと思い、 mysql> SHOW VARIABLES LIKE 'char%';でチェックし比べてみたところ 正常(ローカル、ロリポップともに)のものは character set client utf8 character set connection utf8 character set database utf8 なのに 文字化けするほうは(北米のサーバー) character set client latin1 character set connection latin1 character set database latin1 でした。文字コードのデフォルトが違うからだと思い、ググって見たところ、 結構よくある問題で、my.cnf でデフォルト文字設定utf-8に変更するなどで解決できるとありました。 でも、使っているサーバーは予めphpMYadminがインストールされているレンタルサーバーであるのでmy.cnfはさわれないのでは??? サーバー会社に連絡して変更可能かと聞いたところ、my.cnfを変更することはできません。またデータベースのサポートはいたしません。と冷たく返答。サーバー会社を変えたいところですが、自分が借りたサーバーではないのでそのまま使うしかありません。 ただ、教わった、sqlコマンドからALTER DATABASE <your_database_name> CHARACTER SET utf8 COLLATE utf8_general_ci を実行したところcharacter set databaseのみutf8になりました。(文字化けは一緒) character set connection とcharacter set database をmy.cnfをいじらず、sqlコマンドで変更可能なのでしょうか? もし、無理ならばどのような方法があるのでしょうか? サイトのフォームからの送信と受信はUTF-8に設定しています。 (だからだとおもいますが、ブラウザの表示だけは文字化けせずにでます。) お知恵がありましたらよろしくお願いします。

    • ベストアンサー
    • MySQL
  • sjisを使いたい!

    Linux(RedHat9)上のMySQL(ver 4.1.7)でsjisを使いたいのに使えなくて困っています。MySQLは標準でlatin1に指定されているので、日本語を用いたいため、sjisに変えようと思いました。よって、my.cnfの[mysqld]、[mysqldump]、[mysql]それぞれにdefault character set=sjisと記述したのですが、そうするとMySQLが起動できなくなりました。何故かと思い、上記の記述をやめて幾つか調べました。とりあえずmysql> status;では Server characterset: latin1 Db characterset: latin1 Client characterset: latin1 Conn. characterset: latin1 そしてmysql> show character set;をしてみると、 Charsetの中に、ujisもsjisも入っていませんでした。よって、このMySQLがサポートしていないsjisを設定ファイルに記述しても起動できなくなる訳です。 他のどのPCのMySQLにもsjisなどは当たり前のように入って いるのに・・。 mysql> set character set sjis;や mysql> set names sjis;とやっても、以下のエラー。 ERROR 1115 (42000): Unknown character set: 'sjis' このMySQLの状態を調べるため、mysql> show variables ike 'char%';とすると、 Variable_name | Value character_set_client | latin1 character_set_connection | latin1 character_set_database | latin1 character_set_results | latin1 character_set_server | latin1 character_set_system | utf8 character_sets_dir | /usr/local/mysql/share/mysql/charsets/ となっています。このような状況で、どうやったらこの MySQLはsjisを使えることができるようになるでしょうか。 どなたかお気づきの点でもあればアドバイスよろしくお願いします。m(_ _)m

    • ベストアンサー
    • MySQL
  • 再度文字コードについて

    前回文字化けについて質問させていただいたのですが、うまく解決しなかったためまた質問させていただきます。 まず、テーブルの文字セットはシフトJISに無事変更することができました。しかしやはりset names sjisをおこなうとうまくいきません。それをおこなわない場合は文字化けせずにうまくいきます。 MySQLのデフォルト文字セットはlatin1になっているのですが、この場合 クライアントからSQLへsjis→latin1→sjisのような変換がおこなわれているのでしょうか?set names sjisはクライアントがsjisであるということをMySQL側に明示しているだけなんですよね? PHPの文字セットがシフトjisなのにset names sjisでうまくいかずset names latin1でうまくいくのがどうもよくわからないのですが…… 度々すいませんが、わかるかたお願いします。

  • MAMPのMySQLで文字化けする

    すみません、教えてください(><) mac( os X 10.7.5)でMAMP+Eclipse+PHPを使って以下のようにMySQLにデータ挿入 mysql_connect('localhost','root','root') or die(mysql_error()); mysql_select_db('mymy'); mysql_query('SET NAMES UTF-8'); mysql_query('INSERT INTO item SET id=1, name="あいうえお"'); をしたのですが、 phpMyadminからデータを確認してみると日本語が文字化けしてしまいます。 (phpMyadminからデータを挿入した場合はちゃんと表示されます。) 色々と調べ、 Eclipseの環境設定でワークスペースの文字コードやphpの文字コードをUTF-8にしたり、 MySQLのmy.cnfファイルの中に以下 [client] default-character-set = utf8 [mysqld] skip-character-set-client-handshake default-character-set = utf8 character-set-server = utf8 collation-server = utf8_unicode_ci init-connect = SET NAMES utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 を追加して再起動し、DBを一旦削除して再度作り直して挿入してみたりとやったのですが、改善されません。 サーバ接続の照合順序 は「utf8_general_ci」として作成しています。 コンソールからMySQLへ接続してDBの文字コードを確認してみると character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /Applications/MAMP/Library/share/charsets/ | というかたちになっています。 他にどういった点を改善すればいいのでしょうか? もうお手上げ状態でどうすることも出来ずにいます。。。

  • mysqlの文字化けが治せません・・・;;

    現在、MYSQL+PHPを勉強中の初心者なのですが PHPにて作成したフォームデータをレンタルサーバ上のデータベースへと入力するプログラムを作成したのですが送られた日本語データがphpmyadminで確認すると全て文字化けしてしまいます。 また、データベースのデータをブラウザ上に表示するPHPプログラムでもブラウザ上では文字化けしています。 おそらく、MYSQLの文字コードの指定がまずいとおもうのですがその指定する方法がわかりません。 サーバのOSはFREEBSDで MYSQLは4.0を使用しています。 telnetを使用して、サーバにはアクセスしています。 各charsetは変数、セッション値、グローバル値の順に client utf8 latin1 connection sjis latin1 database latin1 latin1 results utf8 latin1 server latin1 latin1 system utf8 utf8 character sets dir /usr/local/share/mysql/charsets/ /usr/local/share/mysql/charsets/ collation connection sjis_japanese_ci latin1_swedish_ci collation database latin1_swedish_ci latin1_swedish_ci collation server latin1_swedish_ci latin1_swedish_ci となっています。 この質問掲示板も確認したのですが my.cnfやmy.ini等のファイルがサーバ上に 見つからず質問させて頂いております。 どうぞ、よろしくお願い致します。

  • XAMPPの文字化け

    データベース(MySQL)に接続してデータを表示するというプログラムをPHPで作っています。ですが、日本語の部分が文字化けをしてしまいました。 どうやらソースコードではなくXAMPPの設定に原因があるそうです。 my.iniに以下の記述を追記すればよいとのことなのでmy.iniを変更したのですが、そうするとMySQLが起動できなくなってしまいます(起動してもすぐ自動的にストップしてしまいます) なので、my.iniの内容をコピーしたmy.confを作成し、そこに以下の記述を追記しました。 [client] default-character-set = utf8 [mysqld] skip-character-set-client-handshake default-character-set = utf8 character-set-server = utf8 collation-server = utf8_general_ci init-connect = SET NAMES utf8 [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8 すると、MySQLは起動できるようになりました。しかしステータスを参照すると以下のように表記されており変更が反映されていません。 +--------------------------+----------------------------------------+ | Variable_name | Value +--------------------------+----------------------------------------+ | character_set_client | cp932 | character_set_connection | cp932 | character_set_database | latin1 | character_set_filesystem | binary | character_set_results | cp932 | character_set_server | latin1 | character_set_system | utf8 | character_sets_dir | D:\program\xampp\mysql\share\charsets\ | +--------------------------+----------------------------------------+ どうすればいいのでしょうか?いろいろ調べて試してみたのですが分かりません。このせいで先に進めず困っております。助けてください。。 保存先フォルダは D:\program\xampp\mysql です。 OSは Windows Vista です。 バージョンは ApacheFriends XAMPP version 1.7.7 + Apache 2.2.21 + MySQL 5.5.16 (Community Server) + PHP 5.3.8 (VC9 X86 32bit thread safe) + PEAR です。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • mysqlの文字化けについてです

    学校でjavaの勉強をしている者です。 初心者です。 学校の宿題をやるために、自宅でmysqlをインストールしたのですが、 javaで実行すると文字化けしてしまいます。 学校では、my.iniの中の [mysql] default-character-set=latin1 を [mysql] default-character-set=sjis と変更し、 [mysqld] default-character-set=latin1 を [mysqld] default-character-set=sjis skip-character-set-client-handshake と変更し、 SQLを再起動すれば解決すると習ったのですが、 文字化けが起こってしまいます。 show variables like '%char%'で文字コードを確認してみたところ、 | character_set_client | latin1 | | character_set_connection | latin1 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | latin1 | | character_set_server | latin1 | | character_set_system | utf8 | このように、sjisになっていませんでした。 どうしてなんでしょうか? どなたか解答のほどよろしくお願いします。

  • mysqlの文字コードの変更方法について教えてください。

    /etc/my.cnfの[mysqld]と[mysql]にdefault-character-set = utf8を 追記したのですが、statusで確認すると Server characterset: latin1 Db characterset: latin1 Client characterset: utf8 Conn. characterset: utf8 とサーバー側の文字コードが変更できていません。 ネットや本で調べてみたのですがわからず、困っております。 どなたか分かる方よろしくお願いいたします。

専門家に質問してみよう