【问题标题】:UTF-8 Database ProblemUTF-8 数据库问题
【发布时间】:2011-02-06 14:53:44
【问题描述】:

我有一个具有 UTF-8 字符集的 MySQL 表,在尝试通过 PHP 表单插入时,数据库给出以下错误:

PDOStatement::execute(): SQLSTATE [HY000]:一般错误:1366 不正确的字符串值:'\xE8' 专栏...

有问题的字符是“è”,但考虑到数据库和表设置为 UTF-8,我不明白为什么这应该是一个问题。

编辑

我直接从mysql终端尝试过,也遇到了同样的问题。

【问题讨论】:

  • 在进行查询之前您是否尝试过 mysql_query('SET NAMES UTF-8')?
  • 是的,我试过了(顺便说一句,它是 UTF8,不是 UTF-8 :)
  • 关于您的评论的另一个想法:您是否确保用于发送表单的字符集是 UTF-8(客户端;以 XML 编码或标头/元属性设置,也许还有由
    ) 强制执行? PHP 可能会或可能不会在内部使用 UTF-8 (php.ini),但在某些服务器上,您不允许动态更改该字符集。如果 PHP 使用一些 8 位字符集,它仍应将您的 UTF-8 编码文本传递给数据库(mysql_real_escape_string 取决于数据库字符集)但 PHP 可能需要 utf8_decode/utf8_encode 进行字符串操作。

标签: php sql mysql utf-8


【解决方案1】:

在将值传递给 Mysql 之前,您可以使用以下代码:

$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);

将字符串转换为UTF-8,如果只是一个字段的问题。

【讨论】:

  • 你绝对应该避免这样做!检查什么是编码是消耗性的,并不总是准确的:最好尝试通过其他方式了解编码实际上是什么(如果你没有足够的运气没有线索,它经常被提及,有时甚至多次被提及)。
  • 是的,你是对的。提到的是解决问题的快速解决方案。您应该使用 Mysql 解决问题
【解决方案2】:

您的数据库可能设置为 UTF-8,但数据库连接也需要设置为 UTF-8。您应该使用SET NAMES utf8 声明来做到这一点。您可以在 PDO 中使用 driver_options 让它在您连接后立即执行:

$handle = new PDO("mysql:host=localhost;dbname=dbname",
    'username', 'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

查看以下两个链接,了解有关确保您的整个网站正确使用 UTF-8 的更多详细信息:

【讨论】:

  • 为了将来参考,我这样做了。问题是多字节字符串。
【解决方案3】:

E8 大于单字节 UTF8 字符中的最大可用字符 7F:http://en.wikipedia.org/wiki/UTF-8

您的连接似乎未设置为 UTF8,而是设置为其他 8 位编码,如 ISO Latin。如果将数据库设置为 UTF8,则仅更改数据库内部使用的字符集,连接可能使用不同的默认值(旧 MySQL 版本为 latin1),因此您应该在连接到数据库后尝试发送初始 SET CHARACTER SET utf-8。如果您有权访问 my.cnf,您还可以在那里设置正确的默认值,但请记住,更改默认值可能会破坏在同一主机上运行的任何其他站点/应用程序。

【讨论】:

  • 谢谢,使用 php 的 utf8_encode() 函数解决了问题。
  • SET CHARACTER SET 不是正确的命令(参见:stackoverflow.com/questions/1566602/…),它应该是utf8,而不是utf-8。 @Danten,如果您已正确设置所有内容,则不需要使用 utf8_encode()
  • 由于某种原因,SET NAMES 在我们的一些客户端服务器上从来没有像我们需要的那样工作(在一些服务器上它似乎根本没有效果)。不幸的是,字符集的命名因您使用的发行版而异。 utf-8 在我们部署到的所有服务器上都可用,而 utf8 有时是未知的。然而,由于我们必须支持一些奇怪的托管网络空间,其中一些可能有错误的设置。在任何情况下,如果必须在部署时快速进行更改,至少应该将字符集(可能还有命令本身)保存在配置文件中。
猜你喜欢
  • 2014-12-18
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多