PHP PDO和COLLATE

时间:2015-09-04 10:04:06

标签: php mysql pdo utf-8

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

以下数据示例过于简单,以提高可读性。而且我尽量准确,所以有点长(抱歉)。

上下文

在数据库中,我有一些字符串,如“année”,“annee”,“début”,“debut”等。表和列是charset utf8,带有collat​​e utf8_general_ci。

我正在使用MySQL 5.5.30和PHP 5.4.13与PDO初始化charset utf8:

$this->dbh = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->base . ';charset=utf8', $this->user, $this->pass);

在mysql控制台客户端

如果我选择没有任何整理精度,比如

AND data = :data

with:data =“année”。我会得到“année”和“annee”的行。

然后我用utf8_bin整理精度SELECT,如

AND data = :data COLLATE utf8_bin

with:data =“année”,我只检索带有“année”的行。 COOL。

使用PHP PDO

如果我在PHP脚本中使用相同的SQL,并使用整理精度,我会收到以下错误消息:

 COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary'

如果我使用binary归类,例如

AND data = :data COLLATE `binary`

我收到错误消息

 COLLATION 'binary' is not valid for CHARACTER SET 'utf8'

所以,我的问题是

在PHP脚本中

  • “如何明确地设置字符集?” (我相信我是在PDO中做到的 字符串初始化,但似乎是错误的。 “SET NAMES ......”在这种情况下效果不佳)
  • “与强调字符比较时,如何使用PDO检索正确的结果?”

精密工业

以下是更多细节(在评论中提问)。

*摘自“show create table”

CREATE TABLE `Request` (
`id` int(8) NOT NULL AUTO_INCREMENT,
`client_id` int(8) DEFAULT NULL,
....
`domain_version_corrective` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8

*两个示例SELECT(来自控制台,而不是PHP / PDO):

SELECT domain_id, domain_version_corrective FROM Request WHERE client_id = 3661 AND domain_version_corrective = 'vèrçion 2.0' ;

返回

+-----------+---------------------------+
| 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               |
+-----------+---------------------------+

SELECT domain_id, domain_version_corrective FROM Request WHERE client_id = 3661 AND domain_version_corrective = 'vèrçion 2.0' COLLATE utf8_bin;

返回

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

* charsets:

+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

1 个答案:

答案 0 :(得分:1)

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

data = convert(:data using utf8) collate utf8_bin

似乎PDO始终用PDO标记字符集BINARY的字符串参数。找出如何改变这一点真的很不错。

另外,我不确定将字符串转换为UTF8是否真的正确,我认为技术上可能取决于PHP如何在内部表示字符串。