php は、mysql の文字化け問題の概要を読み取ります。必要な友人はそれを参照できます。
PHPがmysqlを読み込む際、以下の箇所に文字セットが関係します。
1. データベーステーブルの作成時にデータベーステーブルの文字セットを指定します。たとえば、
- create table tablename
- (
- id int not null auto_increment,
- title varchar(20) not null,
- primary key ('id')
- )DEFAULT CHARSET =UTF8;
コードをコピー
2. Mysql文字セット
mysql には、character_set_client、character_set_results、character_set_connection という 3 つの重要な変数があります。
character_set_client を設定することで、PHP がデータベースに保存するエンコード方式を Mysql に伝えます。
character_set_results を設定することで、PHP がどのような種類のエンコードされたデータを取得する必要があるかを Mysql に伝えます。
character_set_connection を設定することで、PHP クエリ内のテキストにどのエンコーディングを使用するかを Mysql に指示します。
3. データベースに接続した後、データベース間で文字を送信するときに使用されるデフォルトの文字エンコーディングを設定します。
mysqli::set_charset() または mysqli::query('set names utf8') を使用して設定します。
「SET NAMES」の代わりに mysqli::set_charset(mysqli:set_charset) を使用してみてください PS: (この記事を参照)
$db = new mysqli('localhost ' ,'user','passwd','database_name');-
$db->set_charset('utf8');
-
コードをコピーします
utf-8 ではなく utf8 であることに注意してください
(ここでの問題は、データベースと PHP のエンコーディングが統一されているのですが、mysqli::set_charset() 関数が呼び出されない場合、データを読み取るときに文字化けが発生することです。これはなぜですか?)
(なお、set names utf8 は以下の 3 つの文に相当します
SETcharacter_set_client = utf8;
SET 文字セット結果 = utf8;
SET 文字セット接続 = utf8;
)
4. HTML ページで使用される文字セット。
コードをコピー - をmetaタグに設定します5. PHP テキスト ファイルで使用される文字セット。
Linux では、vim を使用してファイルを開いて と入力できます。
:エンコーディングを設定します
ファイルで使用されている文字セットを確認してください
コードが文字化けしないようにするには、ファイル自体のエンコーディング、HTML で指定されたエンコーディング、および PHP が Mysql に伝えるエンコーディング (character_set_client とcharacter_set_results を含む) が統一されていることを確認する必要があります。 mysqli:set_charset() 関数または「SET NAMES」も使用します。
「3」以降の質問に対して、データベースリンク後の文字セットを設定した場合と設定しなかった場合の結果をテストする例をいくつか書きました。テスト環境はUbuntu 12.04、MySQL 5.5、php 5.5.7。
結果は以下の通りです:
(1) データベーステーブルの文字セットはutf8です。セット名utf8を使用しないでください
中国語は普通に挿入して読めるのですが、mysqlで文字化けが表示されます
(2) データベーステーブルの文字セットは utf8 なので、セット名 utf8 を使用します
中国語は正常に挿入して読み取ることができ、mysql では正しく表示されます
(3) データベーステーブルの文字セットは utf8 ではないため、セット名 utf8 を使用してください
mysql では表示され、疑問符として読み上げられます。
参考:
[1] 詳細な Mysql 文字セット設定 http://www.laruence.com/2008/01/05/12.html
[2] PHP と MYSQL のエンコーディングの問題 http://blog.csdn.net/martinkro/article/details/5352474
[3] SET NAMES と mysql(i)_set_charset の違いを深く理解するhttp://www.laruence.com/2010/04/12/1396.html
[4] MySQL の「SET NAMES xxx」文字セット問題の分析 http://bbs.phpchina.com/thread-13861-1-1.html
|