【问题标题】:PHP MySQL Encoding Bug?PHP MySQL 编码错误?
【发布时间】:2009-05-07 18:56:10
【问题描述】:

这是我的问题。我有一个名为引号的 mysql 表。在其中一行中,引号包含以下字符

‘ and ’

现在行排序规则是 utf8__unicode__ci

当使用 MySQL Query Browser 和 PHPMyAdmin 检索行时,引号会按预期出现。当我使用 PHP 从数据库中检索它们并将它们显示在屏幕上时,它们会以框的形式出现

� and �

我的html页面有UTF-8编码,所有的UTF-8编码选项都是在php中设置的:

/* Set UTF-8 settings */
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');

/* Set ICONV ini settings */
ini_set('iconv.input_encoding', 'UTF-8');
ini_set('iconv.output_encoding', 'UTF-8');
ini_set('iconv.internal_encoding', 'UTF-8');

/* Set ICONV function settings */
iconv_set_encoding('input_encoding', 'UTF-8');
iconv_set_encoding('output_encoding', 'UTF-8');
iconv_set_encoding('internal_encoding', 'UTF-8');

在我看来它应该可以工作。但它没有:请任何人对此有所了解。

【问题讨论】:

    标签: php mysql encoding utf-8


    【解决方案1】:

    您可能需要在 MySQL 连接上将 UTF-8 设置为所选字符集。如果您使用的是 mysqli PHP 驱动程序,这意味着如下:

    $mysqli = new mysqli("localhost", "my_user", "my_password", "test");
    $mysqli->set_charset("utf8");
    

    【讨论】:

    • 查询是 SET NAMES 'utf8'
    • 我认为实际上是 SET CHARACTER SET 为他做的。 SET NAMES 与表/列/等标识符有关。
    【解决方案2】:

    @Joakim,非常感谢您让我朝着正确的方向前进。我无法使用您的确切代码,因为我使用的是自定义数据库驱动程序,并且它使用旧的 mysql 命令而不是 mysqli 类工作。我尝试使用 mysql_set_charset() 但我的 php 版本不支持它(仍然是 php 5 tho)。

    这是我使用的解决方案:

    mysql_query("SET CHARACTER SET utf8", $this->connection);
    mysql_query("SET NAMES utf8", $this->connection);
    

    【讨论】:

      【解决方案3】:

      您的排序规则对您没有帮助;它只是确定排序顺序。您需要将默认字符集设置为 utf-8,如:

      CREATE TABLE `foo` (
          `id` int not null auto_increment,
          `name` varchar(50)
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8
      

      你应该能够解决这个问题:

      ALTER TABLE `foo` DEFAULT CHARSET=utf8
      

      唯一的问题是,如果索引采用 utf-8 格式,有时您的索引会太长。

      【讨论】:

      • @chaos 我刚试过。它仍然不起作用。它与 PHP 有关,因为 MySQL Query Browser 和 PHPMyAdmin 都正确显示了引号。
      • Erm... 你的 HTTP 文档编码是什么?查看 > Firefox 中的字符编码。
      • 当您通过自己的 PHP 显示数据库内容时,我的意思是;在 PHPMyAdmin 中肯定是 utf-8。
      • 好吧,我们不要等待反馈:我猜你会发现它是 ISO-8859-1,这意味着你需要告诉它是 utf-8。我最喜欢的方法是: header('Content-type: text/html; charset=utf-8');注意 utf-8 周围没有引号;这是浏览器兼容的东西。
      • 原来它是我的 MySQL 连接的字符集。它是 latin1 而不是 utf8。
      猜你喜欢
      • 1970-01-01
      • 2016-09-23
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2021-07-03
      相关资源
      最近更新 更多