MySQLを使用するPHPスクリプトで、以下のようなものがよく見られます
query("SET NAMES utf8");
どのプロジェクトでもこれを行う必要がなかったので、基本的な質問がいくつかあります。
「ñ」や「ö」など、純粋なASCIIで表現できない文字を持つサーバーにデータを送信する場合は常に必要です。
MySQLインスタンスがクライアント接続からデフォルトでUTF-8エンコーディングを期待するように設定されていない場合(多くは、場所とプラットフォームによって異なります)
Unicodeの仕組みがわからない場合は、 http://www.joelonsoftware.com/articles/Unicode.html を読んでください。
「SET NAMES」を使用するかどうか を読んで、SET NAMESの代替案と正確な内容を確認してください。
manual から:
SET NAMESは、クライアントがサーバーにSQLステートメントを送信するために使用する文字セットを示します。
もっと精巧に(そして再び、 manual から無償で解除されました):
SET NAMESは、クライアントがサーバーにSQLステートメントを送信するために使用する文字セットを示します。したがって、SET NAMES 'cp1251'は、サーバーに「このクライアントからの着信メッセージは文字セットcp1251にあります」と伝えます。また、サーバーがクライアントに結果を返信するために使用する文字セットも指定します。 (たとえば、SELECTステートメントを使用する場合、列の値に使用する文字セットを示します。)
エンコードを正しく行うことは本当に難しいです-レイヤーが多すぎます:
PHPからのSQLコマンド「SET CHARSET utf8」は、データベースにどのように格納されていても、クライアント側(PHP)がutf8のデータを確実に取得するようにします。もちろん、最初に正しく保存する必要があります。
テーブル/列に対して定義されたエンコードは、データがそのエンコード内にあるという意味ではありません。テーブルがutf8
として定義されているが、異なるエンコーディングとして格納されている場合、MySQLはそれらをutf8
として扱い、問題が発生します。つまり、最初にこれを修正する必要があります。
各レイヤーでデータフローをエンコードするものをチェックインする必要があります。
たとえば、データを受信した場合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>
解決策は
$conn->set_charset("utf8");
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()(または同様の方法)で接続を開始した後、適切に配置します
parcticeのいくつかの小さなこと:
状態:
Mysqlが文字を処理できる限り、データの保存と読み取りは問題ありません。 dbを見ると、既にそこにがらくたがあることがわかります(例:phpmyadminを使用)。
これまではこれは問題ではありません! (間違っているが頻繁に動作する(ヨーロッパ))..
..別のクライアント/プログラム、または正常に機能する変更されたライブラリがデータの読み取り/保存を行わない限り。その後、あなたは大きな問題に直面しています!
PDOだけではありません。 SQLが「????」のように答えた場合シンボル、プリセット文字セット(UTF-8を希望)は本当に推奨:
if (!$mysqli->set_charset("utf8"))
{ printf("Can't set utf8: %s\n", $mysqli->error); }
またはプロシージャスタイルmysqli_set_charset($db,"utf8")
経由