2010-04-11 36 views
4

我已经有一个UTF-8字符集,并在试图通过PHP的形式插入到它一个MySQL表,数据库提供了以下错误:UTF-8数据库问题

PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...

中的角色问题是'è',但我不明白为什么这应该是一个问题,考虑到数据库和表设置为UTF-8。

编辑

我直接从mysql终端尝试和有同样的问题。

+0

在提出您的查询之前,您是否尝试过mysql_query('SET NAMES UTF-8')? – Tom 2010-04-11 01:06:35

+0

是的,我试过了(它是UTF8,不是UTF-8 btw :) – Danten 2010-04-11 01:20:56

+0

关于你的评论的另一个想法如下:你确定用于发送表单的字符集是UTF-8(客户端;用XML编码设置或头/元属性,也可能由

)强制执行? PHP可能会或可能不会在内部使用UTF-8(php.ini),但在某些服务器上,您不允许动态更改该字符集。如果PHP使用一些8位字符集,它仍然应该将您的UTF-8编码文本传递给数据库(mysql_real_escape_string取决于数据库字符集),但PHP可能需要utf8_decode/utf8_encode字符串操作。 – Energiequant 2010-04-11 10:30:40

回答

1

E8比一个字节的UTF8字符的最大可用字符7F更大:​​

看来你的连接没有被设置为UTF-8,但一些其他8位编码,如ISO拉丁语。如果将数据库设置为UTF8,则只更改数据库在内部使用的字符集,连接可能处于不同的默认值(对于较早版本的MySQL,则为latin1),因此应在连接到数据库后尝试发送初始SET CHARACTER SET utf-8。如果您有权访问my.cnf,您也可以在那里设置正确的默认值,但请记住,更改默认值可能会破坏在同一主机上运行的其他任何网站/应用程序。

+1

谢谢,使用php的utf8_encode()函数解决了问题。 – Danten 2010-04-11 01:20:01

+0

'SET CHARACTER SET'对此不是正确的命令(参见:http://stackoverflow.com/questions/1566602/is-set-character-set-utf8-necessary),它应该是'utf8',而不是'UTF-8'。 @Danten,如果你已经正确设置了所有东西,你不需要使用'utf8_encode()'。 – mercator 2010-04-11 01:33:30

+0

由于某些原因,SET NAMES从未以我们需要的方式在客户端的某些服务器上运行(在某些服务器上,它似乎根本没有任何效果)。不幸的是,字符集的命名取决于您使用的分布。 utf-8在我们部署的所有服务器上都可用,而utf8有时未知。但是,由于我们必须支持一些奇怪的托管网站空间,其中一些网站可能安装了错误的设置。在任何情况下,如果在部署时必须快速进行更改,至少应该将字符集(也可能是命令本身)保存在配置文件中。 – Energiequant 2010-04-11 10:18:49

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恰当:

+0

为了将来的参考,我做到了。问题是多字节字符串。 – Danten 2010-04-11 01:30:44

1

的值传递给MySQL中,你可以使用之前下面的代码:

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

转换字符串为UTF-8,如果它是物质的唯一一个领域。

+0

你绝对应该避免这样做!检查什么是编码正在消耗并且并不总是精确的:最好尝试通过其他方式知道编码实际是什么(如果你不是不幸的是没有线索,它经常被提及,甚至有时多倍)。 – JeromeJ 2013-08-13 21:10:26

+0

是的,你说得对。提到的是解决问题的快速解决方案。你应该通过使用Mysql来解决这个问题 – purab 2013-08-18 13:33:33