web-dev-qa-db-ja.com

MySQLで名前utf8を設定しますか?

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

query("SET NAMES utf8");   

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

  1. これはPDOでのみ行われますか?
  2. PDO固有のものではない場合、それを行う目的は何ですか?私はmysqlのエンコーディングを設定していることを理解していますが、私はそれを使用する必要がなかったので、なぜそれを使用したいのですか?
104
JasonDavis

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

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

Unicodeの仕組みがわからない場合は、 http://www.joelonsoftware.com/articles/Unicode.html を読んでください。

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

69
Vinko Vrsalovic

manual から:

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

もっと精巧に(そして再び、 manual から無償で解除されました):

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

43
karim79

エンコードを正しく行うことは本当に難しいです-レイヤーが多すぎます:

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

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

DDL定義と実際のデータ

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

確認するもの

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

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

変換

たとえば、データを受信した場合windows-1250で、utf-8に保存したい場合は、保存する前に次のSQLを使用します。

SET NAMES 'cp1250';

DBにwindows-1250としてデータがあり、utf8を取得する場合は、次を使用します。

SET CHARSET 'utf8';

いくつかのメモ:

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

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

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>
18
usama sulaiman

解決策は

 $conn->set_charset("utf8");
8
nurp

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文字セットの概念のセクションを参照してください。

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

5
user1783273

皆さんありがとう!

使用しないでください:query( "SET NAMES utf8");これは設定項目であり、クエリではありません。 setCharset()(または同様の方法)で接続を開始した後、適切に配置します

parcticeのいくつかの小さなこと:

状態:

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

Mysqlが文字を処理できる限り、データの保存と読み取りは問題ありません。 dbを見ると、既にそこにがらくたがあることがわかります(例:phpmyadminを使用)。

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

..別のクライアント/プログラム、または正常に機能する変更されたライブラリがデータの読み取り/保存を行わない限り。その後、あなたは大きな問題に直面しています!

1
user3162905

PDOだけではありません。 SQLが「????」のように答えた場合シンボル、プリセット文字セット(UTF-8を希望)は本当に推奨:

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

またはプロシージャスタイルmysqli_set_charset($db,"utf8")経由

0