簡體   English   中英

PHP PDO和COLLATE

[英]PHP PDO and COLLATE

我無法在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 collat​​e精度SELECT,就像

AND data = :data COLLATE utf8_bin

with:data =“année”,我只檢索帶有“année”的行。 涼。

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

*字符集:

+--------------------------+----------------------------+
| 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(:data using utf8) collate utf8_bin

似乎PDO始終用PDO標記字符集BINARY的字符串參數。 找出如何改變它真的很好。

另外,我不確定將字符串轉換為UTF8是否實際上是正確的,我認為技術上它可能取決於PHP如何在內部表示字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM