2
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) 执行,为什么?以及如何执行此操作,谢谢。

4

2 回答 2

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 

您会看到 to 字符 bé 如何编码为三个字节 0x62 0xC3 0xA9 ;最后一个字节是 é 的 utf-8 表示。所以我们有 client-encoding=utf-8 并且输入字符串也是 utf-8 -> 好的
现在,如果我将脚本文件的编码从 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 序列,服务器会做一些完全错误的事情,因为它会将序列解释为与假设不同的东西。

于 2012-08-08T11:11:23.643 回答
0

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

于 2012-08-08T11:11:46.930 回答