【问题标题】:mysql php UTF-8mysql php UTF-8
【发布时间】:2012-03-11 23:41:53
【问题描述】:

这里有个奇怪的问题:

我必须将数据从 CSV 文件写入 mysql 数据库(默认字符集 UTF-8)

当我读取 CSV 并在终端上打印查询字符串(用于调试目的)时,输出是正确的:

insert into orari (pv_id, day) values(5492, 'giovedì pomeriggio')

但是当我使用 mysql 客户端运行选择查询时,结果很奇怪:

*************************** 273. row ***************************
             id: 28856
             day: giovedì pomeriggio
             pv_id: 5760

如果我在 phpmyadmin 上运行查询也是一样。

HTML 输出正确,字符集设置为 UTF-8,并且 àòù 等字符正确显示。

* 编辑 * 这是我的 mysql 字符集和排序规则设置:

SHOW VARIABLES LIKE 'c%';

| 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                                                  |
| collation_connection     | utf8_general_ci                                       |
| collation_database       | utf8_general_ci                                       |
| collation_server         | utf8_general_ci                                       |

【问题讨论】:

  • 你确定你的 CSV 是 UTF-8 吗?
  • 是的,如果我从 CSV 读取结果后打印 mb_detect_encoding($string) 结果是 UTF-8,并且终端中的 echo $string 输出是正确的(终端肯定是 utf8:

标签: php mysql utf-8


【解决方案1】:

您说 HTML 和输入正确,但只有 mysql 和 phpmyadmin 不正确。您还需要为这些设置正确的连接字符集,因为它们默认为latin1,这意味着“8 位干净,每个字符一个字节”。

(这应该不会影响您的问题,但您应该确保您的表或列指定 utf-8 存储。)

您会注意到您的垃圾输出是两个字节,这意味着存储在 DB 中的内容绝对是 UTF8。您的数据在输出时被误解。

对于mysql 终端程序,使用--default-character-set 参数启动它。确保它与您终端的字符集匹配。

不知道phpMyAdmin是怎么设置的,但是应该也有连接字符集的设置。

【讨论】:

    【解决方案2】:

    每个 MySQL 客户端在与服务器握手时都应该指定他们想要的字符集。除非被覆盖,否则默认为latin1。

    您可以在每个连接上发出以下查询以解决此问题:

    SET NAMES 'utf8';
    

    或者您可以按照 MySQL 手册中的说明在MySQL charset configuration 中进行设置。

    【讨论】:

    • 感谢光速答案。我刚刚尝试运行 SET NAMES 'utf8';作为客户端连接后的第一个查询,但输出相同...
    • 您确定 CSV 实际上是 UTF-8 吗?您可以尝试使用mb_detect_encoding 进行查找。
    • mb_detect_encoding 的结果是 UTF-8... 是以某种方式改变字符集的插入查询,因为在此操作之后插入查询字符串是 UTF-8
    • 这是一个我从未遇到过的奇怪问题。对不起。
    • thx 无论如何......可笑的是,如果我在从 CSV 操作读取之前对字符串运行 utf8_decode,我会得到一个奇怪的终端输出,来自 mysql 客户端的正确结果和一个奇怪的 HTML 输出...
    猜你喜欢
    • 2012-06-01
    • 2011-06-05
    • 1970-01-01
    • 2015-07-25
    • 2012-04-11
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多