首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDO和COLLATE

PDO和COLLATE
EN

Stack Overflow用户
提问于 2015-09-04 10:04:06
回答 1查看 2K关注 0票数 3

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

下面的数据示例经过过度简化,以提高可读性。我试着准确地说,所以它有点长(对不起)。

上下文

在数据库中,我有一些字符串,如"année“、"annee”、“dé但”、“首次出现”等。表和列是字符集utf8和utf8_general_ci排序规则。

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

代码语言:javascript
复制
$this->dbh = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->base . ';charset=utf8', $this->user, $this->pass);

mysql控制台客户端中的

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

代码语言:javascript
复制
AND data = :data

带:data = "année“。我会得到行与“安内”和“退火”。

然后我用utf8_bin排序规则的精度进行选择,就像

代码语言:javascript
复制
AND data = :data COLLATE utf8_bin

带:data = "année",我只检索带有"année“的行。凉爽的。

与PHP

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

代码语言:javascript
复制
 COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary'

如果我使用binary排序规则,就像

代码语言:javascript
复制
AND data = :data COLLATE `binary`

我得到了错误信息

代码语言:javascript
复制
 COLLATION 'binary' is not valid for CHARACTER SET 'utf8'

所以,我的问题是

在PHP脚本中

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

Precisions

这里有更多的细节(征求意见)。

*摘录自“显示创建表”

代码语言:javascript
复制
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):

代码语言:javascript
复制
SELECT domain_id, domain_version_corrective FROM Request WHERE client_id = 3661 AND domain_version_corrective = 'vèrçion 2.0' ;

回传

代码语言:javascript
复制
+-----------+---------------------------+
| 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               |
+-----------+---------------------------+

代码语言:javascript
复制
SELECT domain_id, domain_version_corrective FROM Request WHERE client_id = 3661 AND domain_version_corrective = 'vèrçion 2.0' COLLATE utf8_bin;

回传

代码语言:javascript
复制
+-----------+---------------------------+
| domain_id | domain_version_corrective |
+-----------+---------------------------+
| FOOBAR    | vèrçion 2.0               |
+-----------+---------------------------+

*字符集:

代码语言:javascript
复制
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 16:43:39

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

代码语言:javascript
复制
data = convert(:data using utf8) collate utf8_bin

看来,PDO总是用PDO标记字符串参数和字符集二进制。如果能找到改变的方法,那就太好了。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32395317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档