エンコーディングを正しく行うのは本当に難しいです - 層が多すぎます:
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 をお勧めします。