【问题标题】:Getting UTF-8 strings from MySQL using PHP使用 PHP 从 MySQL 获取 UTF-8 字符串
【发布时间】:2012-04-11 02:19:00
【问题描述】:

在浏览了大约两打帖子之后,我被正式难住了。我有一个带有 utf8_general_ci 整理列的数据库。使用 PHPMyAdmin,我能够正确地查看表中的 UTF-8 数据(至少据我所知。)我认为我想做的事情很简单。数据查询过很多方式,只想回显一下utf-8的值:

echo bin2hex("more…"); //note "…" is a special character
6d 6f 72 65 e2 80 a6 (Hex Value)

但是,如果我只是 echo $row->value 我得到:

6d 6f 72 65 85

它提供的 UTF-8 编码:

6d 6f 72 65 c2 85

我读过的大多数帖子都说要使用 mysql_set_charset("utf8") 但这确实搞砸了:

6d 6f 72 65 26 61 63 69 72 63 3b 80 26 62 72 76 62 61 72 3b

最后使用 mysql_set_charset("utf8") & utf8_encode($var):

6d 6f 72 65 26 61 63 69 72 63 3b c2 80 26 62 72 76 62 61 72 3b

我也尝试在 PHP 中设置 UTF8 设置。 Godaddy 使这变得更加困难,所以我使用 ini_set 完成了。但是 mbstring.encoding_translation 不会打开。

// UTF8 settings
ini_set('mbstring.language',            'Neutral');
ini_set('mbstring.internal_encoding',       'UTF-8');
ini_set('mbstring.http_input',          'UTF-8');
ini_set('mbstring.http_output',         'UTF-8');
ini_set('mbstring.encoding_translation',    'On');
ini_set('mbstring.detect_order',        'auto');
ini_set('mbstring.substitute_character',    'long');

关于我需要做什么的任何提示?

【问题讨论】:

  • 您是否尝试过How to handle UTF-8 in a web app 的“清单”?向我们展示一些代码,了解您如何准确地从数据库中插入和检索数据。
  • @deceze 我已经完成了大部分工作。我通过将字符复制粘贴到 PHPMyAdmin 来填充数据。我可以运行一个 select hex(field) 并从 mysql 获得正确的值。我也没有为从数据库中检索数据做任何特别的事情。还有什么我可以测试的吗?
  • 上述文章中的完整测试脚本是否适合您?
  • @deceze 它似乎工作正常。这应该可以帮助我缩小搜索范围。

标签: php mysql utf-8


【解决方案1】:

我敢打赌,您的实际数据可能会以非 utf8 格式存储。

首先确保您的数据库设置正确,这意味着所有内容都真正使用 UTF-8 编码存储。

这是我在遇到类似问题时所做的:

始终在干净的表中进行测试,这意味着您应该出于测试目的创建新的数据库和表,并且从一开始就确保实际存储在数据库中的所有数据都是真正的 utf8 编码。

确保数据库编码为utf8:

CREATE DATABASE `test` CHARACTER SET `utf8` COLLATE `utf8_general_ci`; 

确保包含文本的字段使用 utf8 编码:

CREATE TABLE `test` \
(`id` INT AUTO_INCREMENT PRIMARY KEY, \
`name` VARCHAR(512) COLLATE `utf8_general_ci`) \
CHARACTER SET `utf8` COLLATE `utf8_general_ci`;

确保用于检索数据的连接返回未修改的 UTF-8 字符串。

$connection = mysql_connect( ... );
// Make sure that connection does not change encoding:
mysql_set_charset('utf8', $connection);
// Insert some test data:
mysql_query("INSERT INTO `test` (`name`) VALUES (`Ab✓cdÄö`)", $connection);

然后尝试阅读它并检查它是否正常工作,如果它正常工作,那么您就知道问题在于您现有的数据库、表结构或连接中的某些内容是错误的,并且应该与我们刚刚设置的类似在我们的测试环境中。

如果您使用 phpmyadmin,只需将所有内容设置为 utf8 并选择在每个点都相同的合适 utf8 排序规则。然后尝试使用 phpmyadmin 将一些数据添加到表中,并尝试使用您的 php 应用程序读取它。 utf8_general_ci 应该很好用。

这里有一些信息: MySQL Connection Character Sets and Collations

【讨论】:

    【解决方案2】:

    使用PDO,您可以轻松更改字符集。它还支持准备好的语句、事务等。 因此,您只需在创建类时设置字符集即可。

    来自PHP Manual Comments

    $db = new PDO('mysql:host=your_hostname;dbname=your_db;charset=UTF-8', $user, $pass);
    

    【讨论】:

    • 在我的例子中是charset=utf8。您可以使用 show create table ... 了解您设置中的确切字符集。
    【解决方案3】:

    你可以试试这个:

    SET NAMES utf8;
    SET CHARACTER SET utf8;
    

    请参阅hereherehere

    【讨论】:

    • 根据 PHP 文档已替换为 mysql_set_charset("utf8") 。 Source
    【解决方案4】:

    感谢 Deceze,罪魁祸首最终是需要替换为 htmlentities 调用:

    htmlspecialchars($row['col'], ENT_QUOTES, "UTF-8");
    

    最后我只是误读了自己的代码。毕竟这一切都是那么微不足道的事情。令人沮丧,但很高兴找到了解决方案。

    感谢您的所有帮助。

    【讨论】:

      【解决方案5】:

      这篇文章解释了在 PHP 和 MySQL 中使用 UTF-8 的所有方面:

      希望对您有所帮助并节省您的时间。

      【讨论】:

        猜你喜欢
        • 2017-09-16
        • 1970-01-01
        • 2016-05-31
        • 1970-01-01
        • 2018-04-18
        • 2011-07-29
        • 2023-03-23
        • 1970-01-01
        • 2011-09-06
        相关资源
        最近更新 更多