4

我在从数据库中插入/读取 utf8 内容时遇到问题。我所做的所有验证似乎都表明我的数据库中的内容应该是 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 回答