PHP PDO和COLLATE

PHP PDO和COLLATE,php,mysql,pdo,utf-8,Php,Mysql,Pdo,Utf 8,我无法在mysql数据库中选择一些条目,将法语字符串与重音字符进行比较 下面的数据样本过于简化,以提高可读性。我尽量精确,所以有点长(对不起) 上下文 在数据库中,我有一些字符串,如“année”、“annee”、“début”、“defestment”等。表和列是字符集utf8,带有collate utf8_general_ci 我正在使用MySQL 5.5.30和PHP5.4.13,并使用字符集utf8初始化PDO: $this->dbh = new PDO('mysql:host='

我无法在mysql数据库中选择一些条目,将法语字符串与重音字符进行比较

下面的数据样本过于简化,以提高可读性。我尽量精确,所以有点长(对不起)

上下文

在数据库中,我有一些字符串,如“année”、“annee”、“début”、“defestment”等。表和列是字符集utf8,带有collate utf8_general_ci

我正在使用MySQL 5.5.30和PHP5.4.13,并使用字符集utf8初始化PDO:

$this->dbh = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->base . ';charset=utf8', $this->user, $this->pass);
在mysql控制台客户端中

如果我选择没有任何校对精度,如

AND data = :data
AND data = :data COLLATE `binary`
使用:data=“année”。我会用“Anneée”和“annee”两个词

然后我用utf8\u bin collate precision选择,如

AND data = :data COLLATE utf8_bin
使用:data=“année”,我只检索带有“année”的行。酷

使用PHP PDO

如果我在PHP脚本中使用相同的SQL,并且具有比较精度,则会收到以下错误消息:

 COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary'
如果我使用
二进制
排序规则,比如

AND data = :data
AND data = :data COLLATE `binary`
我收到了错误信息

 COLLATION 'binary' is not valid for CHARACTER SET 'utf8'
那么,我的问题是

在PHP脚本中

  • “如何明确地设置字符集?”(我相信我是在PDO中这样做的 字符串初始化,但它似乎是错误的。“设置名称…”在这种情况下没有更好的效果)
  • “在与重音字符进行比较时,如何使用PDO检索正确的结果?”
精度

这里有更多的细节(在评论中询问)

*从“显示创建表”中提取

*选择两个示例(从控制台,而不是使用PHP/PDO):

返回

+-----------+---------------------------+
| domain_id | domain_version_corrective |
+-----------+---------------------------+
| FOOBAR    | vercion 2.0               |
| FOOBAR    | vèrcion 2.0               |
| FOOBAR    | verçion 2.0               |
| FOOBAR    | vèrçion 2.0               |
| FOOBAR    | vèrcion 2.0               |
+-----------+---------------------------+

返回

+-----------+---------------------------+
| domain_id | domain_version_corrective |
+-----------+---------------------------+
| FOOBAR    | vèrçion 2.0               |
+-----------+---------------------------+
*字符集:

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

我也遇到了同样的问题,我成功地用convert()包装了参数,如下所示:

data=convert(:使用utf8的数据)整理utf8\u bin
PDO似乎总是使用PDO的二进制字符集标记字符串参数。了解如何改变这一点真的很好


此外,我不确定像这样将字符串转换为UTF8是否正确,我认为从技术上讲,这可能取决于PHP如何在内部表示字符串。

Plz提供
SHOW CREATE TABLE
和完整的
SELECT
显示变量,如'char%'。有人叫它
BINARY
,而不是
VARCHAR
。请确保使用与程序相同的用户登录。它不应该是“根”。另外,你的my.cnf中有
init_connect
吗?@RickJames,我添加了问题本身的详细信息。我在控制台和php脚本中使用相同的凭据(不是root)。还有一个空字符串作为init_connect变量。谢谢你的关注!您是否尝试过在
PDO
中使用
PDO::MYSQL\u ATTR\u INIT_COMMAND=>“set names utf8”
作为连接的选项?@EhsanT,是的,但没有成功:(那么,在打开连接后立即添加这一行:
$dbh->exec(“set names utf8”)
?我刚刚尝试了这个解决方案,并得到了想要的结果!!Thanx joki
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+