MySQLを使用するPHPスクリプトで、以下のようなものがよく見られます
query("SET NAMES utf8");
どのプロジェクトでもこれを行う必要がなかったので、いくつか基本的な質問があります。
- これはPDOのみで実行されるものですか?
- PDO固有のものではない場合、それを行う目的は何ですか?mysqlのエンコーディングを設定していることに気づきましたが、私はそれを使用したことがなかったので、なぜそれを使用したいのですか?
MySQLを使用するPHPスクリプトで、以下のようなものがよく見られます
query("SET NAMES utf8");
どのプロジェクトでもこれを行う必要がなかったので、いくつか基本的な質問があります。
回答:
「ñ」や「ö」など、純粋なASCIIで表現できない文字を含むデータをサーバーに送信する場合は常に必要です。
MySQLインスタンスがクライアント接続からのデフォルトでUTF-8エンコーディングを期待するように構成されていない場合(多くは、場所とプラットフォームによって異なります)。
Unicodeの仕組みがわからない場合は、http://www.joelonsoftware.com/articles/Unicode.htmlを参照してください。
「SET NAMES」を使用するかどうかを読んで、SET NAMESの代替案とその正確な内容を確認してください。
SET NAMES UTF8
彼らのために必要がありますか?
SELECT
ステートメントを使用して、このデータを受信するときにも必要です。
マニュアルから:
SET NAMESは、クライアントがSQLステートメントをサーバーに送信するために使用する文字セットを示します。
より入念に(そして、もう一度、マニュアルから不必要に持ち上げられました):
SET NAMESは、クライアントがSQLステートメントをサーバーに送信するために使用する文字セットを示します。したがって、SET NAMES 'cp1251'はサーバーに、「このクライアントからの今後の着信メッセージは文字セットcp1251です」と伝えます。また、サーバーが結果をクライアントに送信するために使用する文字セットも指定します。(たとえば、SELECTステートメントを使用する場合、列の値に使用する文字セットを示します。)
正しいエンコーディングを取得することは本当にトリッキーです-レイヤーが多すぎます:
PHPからのSQLコマンド "SET CHARSET utf8"は、データベースにどのように格納されているかに関係なく、クライアント側(PHP)がutf8でデータを取得できるようにします。もちろん、最初に正しく保存する必要があります。
テーブル/列に対して定義されたエンコーディングは、データがそのエンコーディングであることを実際には意味しません。テーブルが定義されているutf8
が、異なるエンコーディングとして保存されている場合、MySQLはそれらを次のように扱いutf8
、問題が発生します。つまり、これを最初に修正する必要があります。
各レイヤーでデータフローのエンコーディングをチェックインする必要があります。
eg windows-1250
でデータを受け取り、に保存したい場合はutf-8
、保存する前にこのSQLを使用します。
SET NAMES 'cp1250';
DBにデータがあり、取得しwindows-1250
たい場合はutf8
、以下を使用します。
SET CHARSET 'utf8';
このクエリは、データベースでデータを作成または更新するクエリの前に記述する必要があります。このクエリは次のようになります。
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>
これを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文字セットの概念のセクションを参照してください。
皆さんありがとう!
使用しないでください:query( "SET NAMES utf8"); これはセットアップではなく、クエリです。setCharset()(または同様のメソッド)で接続を開始した後、正しく配置します
説得力のある小さなこと:
状態:
mysqlが文字を処理できる限り、データの保存と読み取りは問題ありません。あなたがデータベースを見ると、あなたはすでにそこにがらくたがあるのを見るでしょう(例えば、phpmyadminを使用して)。
今までこれは問題ではありません!(間違っていますが、頻繁に動作します(ヨーロッパ))..
..正しく機能する別のクライアント/プログラムまたは変更されたライブラリがデータを読み取ったり保存したりしない限り。それからあなたは大きな問題を抱えています!
PDOだけではありません。SQLが「????」のように応答する場合 シンボル、プリセットの文字セット(UTF-8を希望)をお勧めします。
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
または手順スタイルを介して mysqli_set_charset($db,"utf8")