这个é
字符是如何编码的?(例如 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 序列,服务器会做一些完全错误的事情,因为它会将序列解释为与假设不同的东西。