我无法在mysql数据库中选择一些条目,将法语字符串与重音字符进行比较。
下面的数据示例经过过度简化,以提高可读性。我试着准确地说,所以它有点长(对不起)。
上下文
在数据库中,我有一些字符串,如"année“、"annee”、“dé但”、“首次出现”等。表和列是字符集utf8和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带:data = "année“。我会得到行与“安内”和“退火”。
然后我用utf8_bin排序规则的精度进行选择,就像
AND data = :data COLLATE utf8_bin带:data = "année",我只检索带有"année“的行。凉爽的。
与PHP
如果我在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脚本中
Precisions
这里有更多的细节(征求意见)。
*摘录自“显示创建表”
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*两个示例选择(来自控制台,而不是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 |
+-----------+---------------------------+*字符集:
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+发布于 2016-02-16 16:43:39
我也遇到了同样的问题,我成功地将参数包装为convert(),如下所示:
data = convert(:data using utf8) collate utf8_bin看来,PDO总是用PDO标记字符串参数和字符集二进制。如果能找到改变的方法,那就太好了。
另外,我不确定像这样将字符串转换成UTF8是否真的正确,从技术上来说,这可能取决于PHP如何在内部表示字符串。
https://stackoverflow.com/questions/32395317
复制相似问题