4

データベースからの utf8 コンテンツの挿入/読み取りに問題があります。私が行っているすべての検証は、DB のコンテンツが utf8 でエンコードされている必要があることを示しているようですが、ラテン語でエンコードされているようです。データは、最初に CLI の PHP スクリプトからインポートされます。

構成:

Zend Framework Version: 1.10.5
mysql-server-5.0:   5.0.51a-3ubuntu5.7
php5-mysql:     5.2.4-2ubuntu5.10
apache2:        2.2.8-1ubuntu0.16
libapache2-mod-php5:    5.2.4-2ubuntu5.10

検証:

-mysql:

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_bin        |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

-データベース

created with 
CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_bin;
CREATE SCHEMA `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin ;

mysql> status;
--------------
mysql  Ver 14.12 Distrib 5.0.51a, for debian-linux-gnu (i486) using readline 5.2

Connection id:          7
Current database:       mydb
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.0.51a-3ubuntu5.7-log (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 9 min 45 sec

-sql: 挿入を行う前に、

SET names 'utf8';

-php: 挿入を行う前に、utf8_encode()mb_detect_encoding()を使用して、'UTF-8' を取得します。db からコンテンツを取得した後、ユーザーに送信する前に mb_detect_encoding() も 'UTF-8' を返します

検証テスト:

コンテンツを適切に表示する唯一の方法は、コンテンツ タイプをラテン語に設定することです (トラフィックをスニッフィングすると、ISO-8859-1 のコンテンツ タイプ ヘッダーが表示されます)。

ini_set('default_charset', 'ISO-8859-1');

このテストは、コンテンツがラテン語として出力されることを示しています。理由がわかりません。誰にもアイデアはありますか?

ありがとう。

4

2 に答える 2

8

まあ、それSET NAMESはそれほど素晴らしいことではないことがわかりました。ドキュメントを見てみましょう...

私が通常行うことは、4 つのクエリを実行することです。

SET CHARACTER SET 'UTF8';
SET character_set_database = 'UTF8';
SET character_set_connection = 'UTF8';
SET character_set_server = 'UTF8';

それを試してみて、それがあなたに合っているかどうかを確認してください...

ああ、覚えておいてください、すべての UTF-8 文字 <= 127 は有効な ISO-8859-1 文字でもあります。したがって、ストリーム内に 127 以下の文字しかない場合は、mb_detect_encoding普及率の高い文字セット (デフォルトでは「UTF-8」) に分類されます...

于 2010-07-22T16:54:48.537 に答える
1
  1. 回収前に何をしていますか?「SET NAMES utf8;」も?それ以外の場合、MySQL は、接続が使用されていることを示す文字セットにサイレントに変換します。
  2. それさえなければ、SHOW FULL COLUMNS FROM table;ショーは何をしますか?デフォルトの文字セットを持つテーブルを持つことは、列がそうであることを意味しません。つまり、これは有効です:

.

CREATE TABLE test (
    `name` varchar(10) character set latin1
) CHARSET=utf8
于 2010-07-22T16:59:15.237 に答える