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

标签 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)执行,为什么?以及如何执行这个, 谢谢。

最佳答案

这个é字符是如何编码的? (例如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 版本附带了一个 mysql 连接器,该连接器使用 utf-8 作为默认连接字符集。
因此输出是

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 -> 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 序列,服务器会做一些完全错误的事情,因为它会将序列解释为与假设不同的东西。

关于php - mysql不执行where子句中的特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11863200/

相关文章:

php - Go 与 PHP json-rpc 通信

mysql - #1064 - 您的 SQL 语法有错误......第 15 行 'TYPE=MyISAM AUTO_INCREMENT=1' 附近

mysql - 创建函数时遇到问题。有人可以帮助我吗?

mySQL 数据提供程序 .NET Core 2.0

php - 外部 CSS 链接无效

javascript - 使用 PHP/Javascript 测试网络速度

PHP : paypal recurring payments token is invalid

php - 为服务器子域/子文件夹上的不同 PHP 应用程序连接/组合 MySQL 数据库中的多个用户表

php - SQLSTATE[23000] : Integrity constraint violation: 1048 Column 'description' cannot be null (SQL: insert into) in laravel

php - 如何在 Opencart 2.3.0.2 中为某个类别的产品设置样式