MySQLで名前を設定utf8?


110

MySQLを使用するPHPスクリプトで、以下のようなものがよく見られます

query("SET NAMES utf8");   

どのプロジェクトでもこれを行う必要がなかったので、いくつか基本的な質問があります。

  1. これはPDOのみで実行されるものですか?
  2. PDO固有のものではない場合、それを行う目的は何ですか?mysqlのエンコーディングを設定していることに気づきましたが、私はそれを使用したことがなかったので、なぜそれを使用したいのですか?

4
SQLインジェクションのため、「SET NAMES utf8」は避けてください。詳細については、php.net / manual / en / mysqlinfo.concepts.charset.phpを参照してください。
masakielastic 2013年

3
@masakielastic 'set names utf8'の設定がSQLインジェクションに対する脅威である場所がわかりませんか?適切なMySQL APIを使用して、スレッドはどこにありますか?
ブロードバンド

3
私の不親切でごめんなさい。ircmaxellの回答を参照してください:stackoverflow.com/a/12118602/531320の「SET NAMES」Althoghは長いUTF-8を使用するなどとして問題がない、あなたが将来的にGBKかのBig5(中国語)またはシフトJIS(日本語)を使用します可能性が否定できない。
masakielastic 2013

回答:


74

「ñ」や「ö」など、純粋なASCIIで表現できない文字を含むデータをサーバーに送信する場合は常に必要です。

MySQLインスタンスがクライアント接続からのデフォルトでUTF-8エンコーディングを期待するように構成されていない場合(多くは、場所とプラットフォームによって異なります)。

Unicodeの仕組みがわからない場合は、http://www.joelonsoftware.com/articles/Unicode.html参照してください

「SET NAMES」を使用するかどうかを読んで、SET NAMESの代替案とその正確な内容を確認してください。


3
'ö'と 'ñ'は拡張ASCIIです。あなたはまだSET NAMES UTF8彼らのために必要がありますか?
Tim

2
私はしばしばutf8_decode($ my_text);を追加する必要があることを発見しました。PHPでは、MySQLからデータが照会されたときに、特別なUTF-8文字を取得してWebサイトに適切に表示します。MySQLでテーブルと列がUTF-8に設定されています。これは必要ですか?
NexusRex 2011

1
@ Vinko Vrsalovic:必ずしもそうではありません...私のファイルはすべてutf8にありましたが、以前のホスティング業者はmysqlの文字セットをlatin1に設定していて、文字列をutf8(したがって、セット名utf8)で送信していることをmysqlに伝えていないため、それらを保存しました彼らのように見えたラテン文字セットと私のすべての特殊文字(スロベニアのCSZ)に車でオーバーランした-もう一つ:あなたはphpMyAdminの中で検索を行うとき、CはAのようなので、上にあるので、あなたは、結果を見つける文句を言わない
エリックČerpnjak

これは、サーバーが結果をクライアントに送り返すために使用する文字セットも指定することに注意してください。したがって、たとえばSELECTステートメントを使用して、このデータを受信するときにも必要です。
Leopoldo Sanczyk 2015年

@ティム。「拡張ASCII」のようなものは実際にはありません。すべてが拡張ASCII(前半がASCIIと同じであり、それらの負荷が存在する任意の1バイト文字セット)と呼ぶことができるさまざまなエンコーディングがたくさんあります。
TRiG

43

マニュアルから:

SET NAMESは、クライアントがSQLステートメントをサーバーに送信するために使用する文字セットを示します。

より入念に(そして、もう一度、マニュアルから不必要に持ち上げられました):

SET NAMESは、クライアントがSQLステートメントをサーバーに送信するために使用する文字セットを示します。したがって、SET NAMES 'cp1251'はサーバーに、「このクライアントからの今後の着信メッセージは文字セットcp1251です」と伝えます。また、サーバーが結果をクライアントに送信するために使用する文字セットも指定します。(たとえば、SELECTステートメントを使用する場合、列の値に使用する文字セットを示します。)


6
わたしは、あなたを愛しています。ちょうど私の夜を作ったよ!
karim79 2012

34

正しいエンコーディングを取得することは本当にトリッキーです-レイヤーが多すぎます:

  • ブラウザ
  • ページ
  • PHP
  • MySQL

PHPからのSQLコマンド "SET CHARSET utf8"は、データベースにどのように格納されているかに関係なく、クライアント側(PHP)がutf8でデータを取得できるようにします。もちろん、最初に正しく保存する必要があります。

DDL定義と実際のデータ

テーブル/列に対して定義されたエンコーディングは、データがそのエンコーディングであることを実際には意味しません。テーブルが定義されているutf8が、異なるエンコーディングとして保存されている場合、MySQLはそれらを次のように扱いutf8、問題が発生します。つまり、これを最初に修正する必要があります。

チェックするもの

各レイヤーでデータフローのエンコーディングをチェックインする必要があります。

  • HTTPヘッダー、ヘッダーを確認してください。
  • リクエストの本文で実際に何が送信されているかを確認します。
  • MySQLにはほぼどこでもエンコーディングがあることを忘れないでください。
    • データベース
    • テーブル
    • カラム
    • サーバー全体
    • クライアント
      どこにでも正しいものがあることを確認してください。

変換

eg windows-1250でデータを受け取り、に保存したい場合はutf-8、保存する前にこのSQLを使用します。

SET NAMES 'cp1250';

DBにデータがあり、取得しwindows-1250たい場合はutf8、以下を使用します。

SET CHARSET 'utf8';

その他のメモ:

  • データの表示に「スマート」なツールに頼りすぎないでください。たとえば、phpMyAdminは(私が使用していたときに)エンコーディングが本当に悪いです。そして、それはすべての層を通過するので、見つけるのは困難です。
  • また、Internet Explorerには、奇妙なルールに基づいてエンコードを「推測」するという本当に愚かな動作がありました。
  • エンコーディングを切り替えることができるシンプルなエディターを使用します。MySQL Workbenchをお勧めします。

19

このクエリは、データベースでデータを作成または更新するクエリの前に記述する必要があります。このクエリは次のようになります。

mysql_query("set names 'utf8'");

ヘッダーで使用しているエンコードを記述する必要があります。たとえば、utf-8を使用している場合は、このようにヘッダーに追加するか、Internet Explorerで問題が発生することに注意してください。

あなたのページはこのようになります

<html>
    <head>
        <title>page title</title>
        <meta charset="UTF-8" />   
    </head>
    <body>
    <?php
            mysql_query("set names 'utf8'");   
            $sql = "INSERT * FROM ..... ";  
            mysql_query($sql);
    ?>    

    </body>
</html>

8
PHP mysqlライブラリを使用するのではなく、MySQLiまたはPDOを使用する必要があります。
アンドレ・フィゲイラ

良い答えです。例をありがとう。これは、私が何をする必要があるかを視覚化するのに役立ち、それが私の問題を解決した1つの答えです!
GTS Joe

1
最後のタグは<html>ではなく</ html>である必要があります
GTS Joe


5

これをSQLクエリで行う代わりに、php関数を使用します。mysqli :: set_charset mysqli_set_charset

Note:

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

詳細については、MySQL文字セットの概念のセクションを参照してください。

http://www.php.net/manual/en/mysqli.set-charset.phpから


1

皆さんありがとう!

使用しないでください:query( "SET NAMES utf8"); これはセットアップではなく、クエリです。setCharset()(または同様のメソッド)で接続を開始した後、正しく配置します

説得力のある小さなこと:

状態:

  • mysqlサーバーはデフォルトでlatin1と通信します
  • あなたの穴アプリはutf8にあります
  • 接続は追加なしで行われる(so:latin1)(SET NAMES utf8 ...なし、set_charset()メソッド/関数なし)

mysqlが文字を処理できる限り、データの保存と読み取りは問題ありません。あなたがデータベースを見ると、あなたはすでにそこにがらくたがあるのを見るでしょう(例えば、phpmyadminを使用して)。

今までこれは問題ではありません!(間違っていますが、頻繁に動作します(ヨーロッパ))..

..正しく機能する別のクライアント/プログラムまたは変更されたライブラリがデータを読み取ったり保存したりしない限り。それからあなたは大きな問題を抱えています!


0

PDOだけではありません。SQLが「????」のように応答する場合 シンボル、プリセットの文字セット(UTF-8を希望)をお勧めします。

if (!$mysqli->set_charset("utf8")) 
 { printf("Can't set utf8: %s\n", $mysqli->error); }

または手順スタイルを介して mysqli_set_charset($db,"utf8")

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.