mysql不执行where子句中的特殊字符

时间:2012-08-08 11:06:48

标签: php mysql

SELECT c.ci_num, 
      CASE 
           WHEN c.ci_homonym=1 
           THEN concat(ci_name,', ',name_fr) 
           ELSE ci_name 
      END as ci_name 
FROM city as c join fr_department as fr on c.ci_sr=fr.code  
WHERE ci_name LIKE 'bé%'  
LIMIT 5

我选择了city_name和city_num,但是当有特殊字符(bé)字符串时它不执行查询但是当我执行此查询到phpmyadmin时此查询显示结果。为什么不执行mysql_query($ query1),为什么?以及如何执行此 感谢。

2 个答案:

答案 0 :(得分:3)

这个é字符是如何编码的? (例如utf-8)
通过mysql_set_charset()相应地设置mysql连接使用的字符集。这也会影响用于比较字符的排序规则。每个字符集都有默认排序规则,即比较/排序字符的默认方式。对于大多数字符集,可以使用多个字符集,例如忽略大/小写。

为了掌握与mySQL相关的字符集(和校对),我建议阅读

---编辑:示例---

我们以此脚本(文件)

为例
<?php
$startsWith = 'bé';

$mysql = mysql_connect('localhost', 'localonly', 'localonly') or die(mysql_error());
mysql_select_db('test', $mysql) or die(mysql_error());

echo 'version: ', PHP_VERSION, "\n";
echo 'os: ', PHP_OS, "\n";
echo 'mysql_client_encoding: ', mysql_client_encoding($mysql), "\n";
for($i=0; $i<strlen($startsWith); $i++) {
    printf('%02X ', ord($startsWith[$i]));
}

我的编辑器保存了默认编码的utf-8文件,显然(以前不知道)我的php版本附带了一个使用utf-8作为默认连接字符集的mysql连接器。
因此输出

version: 5.4.1
os: WINNT
mysql_client_encoding: utf8
62 C3 A9 

你看到如何将字符bé编码为三个字节0x62 0xC3 0xA9;最后一个字节是é的utf-8表示。所以我们有client-encoding = utf-8,输入字符串也是utf-8 - &gt; OK
现在,如果我将脚本文件的编码从utf-8更改为iso-8859-1,结果是

version: 5.4.1
os: WINNT
mysql_client_encoding: utf8
62 E9

现在é仅由一个字节编码;它是该角色的iso-8859-1表示。如果这个字节序列被发送到mysql服务器(期望从客户端获得utf-8序列),服务器将不知道如何处理它 - 因为它是无效的utf-8序列。更糟糕的是,如果iso-8859序列偶然形成一个有效的utf-8序列,服务器会做一些完全错误的事情,因为它会将序列解释为与假设不同的东西。

答案 1 :(得分:0)

如果“bé”是硬编码的,则可能与文件编码有关。特别是对于特殊字符,数据库的文件编码应始终与PHP脚本相同。