mysqli_set_charset
を使用します
接続直後にクライアントエンコーディングをUTF-8に変更するには:
$mysqli->set_charset("utf8");
クライアントエンコーディングは、MySqlが入力を期待するもの(たとえば、ユーザーが入力したテキストを検索クエリに挿入する場合)であり、結果を提供するものです(したがって、echo
正しく表示するため)。
上記の2つのシナリオを説明するには、ウェブページのエンコーディングと一致させる必要があります PHPソースファイルのエンコーディング(クエリのハードコードされた部分が正しく解釈されるようにするため)。
更新:latin-1を使用して挿入されたデータをutf-8に変換する方法
間違った接続エンコーディングを使用してすでに挿入されているデータに関しては、問題を解決するための便利な解決策があります。この種のデータを含む列ごとに、次のことを行う必要があります。
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
プレースホルダーtable_name
、column_name
およびexisting_column_type
毎回データベースの正しい値に置き換える必要があります。
これは何ですか
- MySqlにlatin1のその列にデータを格納する必要があることを伝えます。この文字セットにはutf8の小さなサブセットしか含まれていないため、通常、この変換にはデータの損失が伴いますが、この特定のシナリオでは、データは入力時にlatin1として既に解釈されているため、副作用はありません。ただし、MySqlは、データのバイト表現を内部的に変換して、PHPから最初に送信されたものと一致させます。
- 列をバイナリタイプに変換します(
BLOB
)関連付けられたエンコーディング情報がありません。この時点で、列には適切なutf8文字列である生のバイトが含まれます。 - 列を以前の文字タイプに変換し、生のバイトはutf8エンコーディングであると見なす必要があることをMySqlに通知します。
警告:この無差別なアプローチは、問題の列にのみが含まれている場合にのみ使用できます。 誤って挿入されたデータ。正しく挿入されたデータは、ASCII以外の文字が最初に出現したときに切り捨てられます!
したがって、PHP側の修正が有効になる前に、今すぐ実行することをお勧めします。