PHP : Correct string comparison with special characters

标签 php mysql character-encoding special-characters collation

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 必须为 utf8collat​​ion 应为 utf8_general_ci utf8_unicode_ci。另外,你必须告诉 MySQL 你也想要以 UTF-8 格式查询结果。以下是实现这一目标的三种方法:

  1. 连接查询:连接到 MySQL 后立即执行 SET NAMES utf8
  2. 使用 PDO: $pdo = new PDO($dsn, $user, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8');这与上面基本相同,但由 PDO 自动执行。
  3. 永久 (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/

相关文章:

php - 如何在 Laravel 5.8 中将日期从 "Thu Apr 11 2019 00:00:00 GMT+0200"格式化为 MySQL 格式?

javascript - 在网络应用程序上存储图像的最佳方式是什么?

character-encoding - MockMvc:将 MockHttpServletResponse 的默认字符编码从 ISO-8859-1 更改为 UTF-8

python - 如何在 Python 中打印欧元 (€) 符号?

iphone - QLPreviewController 和 UTF8 字符

php - Blade 模板,@yield 中的@yield()

php - 内部连接 ​​MySQL 查询的问题

MySQL 将 "ORDER BY"子句应用于 UNION 查询

行中的 SQL 求和被提取到列中?

MySQL - 长度()与 char_length()