Possible Duplicate:
PHP : Array key containing special character not found
我正在比较字符串以确定字符串的相应数字。一组字符串存储在 MySQL DB 中,另一组字符串存储为 php 中数组的键。
当尝试查找以下字符串时,在数组中找不到它。 “ child 上学前类/托儿所/托儿所/走读妈妈”
有关代码的更多信息可在 previous question 中找到。这导致我进行了以下测试。
按照建议进行十六进制转储后,我得到了以下结果
来自 MySQL 数据库:
43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 e8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72
来自 php 中的字符串:
43 68 69 6c 64 20 61 74 74 65 6e 64 69 6e 67 20 70 72 65 2d 73 63 68 6f 6f 6c 2f 6e 75 72 73 65 72 79 20 73 63 68 6f 6f 6c 2f 63 72 c3 a8 63 68 65 2f 64 61 79 2d 6d 6f 74 68 65 72
区别在于 MySQL DB 中的“E8”与“C3A8”或“è”与 php 字符串中的“à”。
那么我怎样才能确保硬编码的 php 数组关键字符仍然是“è”?
最佳答案
您应该在 PHP 和 MySQL 中使用相同的编码。
如果您的 PHP 字符串采用 UTF-8 编码,则表的 charset
必须为 utf8
,collation
应为 utf8_general_ci
或 utf8_unicode_ci
。另外,你必须告诉 MySQL 你也想要以 UTF-8 格式查询结果。以下是实现这一目标的三种方法:
- 连接查询:连接到 MySQL 后立即执行
SET NAMES utf8
。 - 使用 PDO:
$pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');
这与上面基本相同,但由 PDO 自动执行。 - 永久 (my.cnf):这将为所有连接设置隐式 UTF-8。只需将:
init-connect='SET NAMES utf8'
添加到MySQL的配置文件my.cnf
即可。
我个人使用第三个选项,但在共享环境中我会选择第二个。
关于PHP : Correct string comparison with special characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13063062/