我已经有一个UTF-8字符集,并在试图通过PHP的形式插入到它一个MySQL表,数据库提供了以下错误:UTF-8数据库问题
PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...
中的角色问题是'è',但我不明白为什么这应该是一个问题,考虑到数据库和表设置为UTF-8。
编辑
我直接从mysql终端尝试和有同样的问题。
我已经有一个UTF-8字符集,并在试图通过PHP的形式插入到它一个MySQL表,数据库提供了以下错误:UTF-8数据库问题
PDOStatement::execute(): SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xE8' for column ...
中的角色问题是'è',但我不明白为什么这应该是一个问题,考虑到数据库和表设置为UTF-8。
编辑
我直接从mysql终端尝试和有同样的问题。
E8比一个字节的UTF8字符的最大可用字符7F更大:
看来你的连接没有被设置为UTF-8,但一些其他8位编码,如ISO拉丁语。如果将数据库设置为UTF8,则只更改数据库在内部使用的字符集,连接可能处于不同的默认值(对于较早版本的MySQL,则为latin1),因此应在连接到数据库后尝试发送初始SET CHARACTER SET utf-8
。如果您有权访问my.cnf,您也可以在那里设置正确的默认值,但请记住,更改默认值可能会破坏在同一主机上运行的其他任何网站/应用程序。
谢谢,使用php的utf8_encode()函数解决了问题。 – Danten 2010-04-11 01:20:01
'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
由于某些原因,SET NAMES从未以我们需要的方式在客户端的某些服务器上运行(在某些服务器上,它似乎根本没有任何效果)。不幸的是,字符集的命名取决于您使用的分布。 utf-8在我们部署的所有服务器上都可用,而utf8有时未知。但是,由于我们必须支持一些奇怪的托管网站空间,其中一些网站可能安装了错误的设置。在任何情况下,如果在部署时必须快速进行更改,至少应该将字符集(也可能是命令本身)保存在配置文件中。 – Energiequant 2010-04-11 10:18:49
您的数据库可能设置为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恰当:
为了将来的参考,我做到了。问题是多字节字符串。 – Danten 2010-04-11 01:30:44
的值传递给MySQL中,你可以使用之前下面的代码:
$val = mb_check_encoding($val, 'UTF-8') ? $val : utf8_encode($val);
转换字符串为UTF-8,如果它是物质的唯一一个领域。
在提出您的查询之前,您是否尝试过mysql_query('SET NAMES UTF-8')? – Tom 2010-04-11 01:06:35
是的,我试过了(它是UTF8,不是UTF-8 btw :) – Danten 2010-04-11 01:20:56
关于你的评论的另一个想法如下:你确定用于发送表单的字符集是UTF-8(客户端;用XML编码设置或头/元属性,也可能由