このシステムは、MySQL データベースにアクセスする PHP アプリケーションです。最初のテーブルは、標準の latin1 エンコーディングで作成され、エンコーディングを設定せずに、PHP の mysqli を介して入力されました。PHP スクリプトとデータはすべて UTF-8 で動作します。
新しいテーブルではエンコーディングが utf8_bin に設定されており、すべてのトランザクションの前にSET CHARACTER SET utf8
送信されます。
(HeidiSQL などの SQL エクスプローラーを使用して) mysql データベースの新しいテーブルを見ると、すべての特殊文字が正しく表示されます。ただし、すべての古いテーブルでは、典型的な latin1-utf8 エラーが ü の Ü のように表示されます。
次のいずれかの方法でこれを修正する簡単な方法はありますか。
- SQL エクスプローラーで正しく表示されるように各テーブルのエンコーディングを修正しますが、PHP コードはそのままにしておきます (すべてのステートメントと共に、
SET CHARACTER SET utf8
またはlatin1
すべてのステートメントの前に、テーブルのエンコーディングを適合させます。(単なる回避策) - すべてのテーブルのエンコーディングを utf8 に切り替えます ->
SET CHARACTER SET utf8
すべての mysqli 接続の開始時に送信する必要があります (または、これを標準として設定する方法がありますか?) - すべてのテーブルのエンコードを latin1 に切り替えます ->
SET CHARACTER SET utf8
トランザクションの前に送信する必要はもうありませんが、データベース エクスプローラーでエンコードが正しくありません。
データベースがすべてのテーブルを utf8 として受け取り、latin1 テーブルを間違った文字で表示しているように見えます。Mysqli は、特に指示がない限り、すべてのテーブルを latin1 と見なします。
アプリケーションは生産的であり、すべてのステートメントの前に適切なエンコーディングが mysqli に通知されるため、エンコーディングの問題はユーザーには見えません。しかし、それは良い習慣ではないように感じます。
データベースのセットアップ方法に問題があることを認識しており、これを修正するためのベスト プラクティスを学びたいと考えています。