PHP:使用特殊字符进行正确的字符串比较

时间:2012-10-25 06:45:51

标签: php mysql character-encoding special-characters collation

  

可能重复:
  PHP : Array key containing special character not found

我正在比较字符串以确定字符串的相应数字。一组字符串存储在MySQL DB中,另一组字符串存储为php中数组的键。

尝试查找以下字符串时,在数组中找不到它。 “孩子上学前/托儿所/托儿所/日间母亲”

previous question中提供了有关该代码的更多信息,这使我进行了以下测试。

按照建议进行十六进制转储后,我得到了以下结果

来自MySQL DB:

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”vs“C3A8”或“è”与来自php字符串的“è”。

那么我怎样才能确保硬编码的php数组关键字仍然是“è”?

1 个答案:

答案 0 :(得分:1)

你应该在PHP和MySQL中使用相同的enconding。

如果您的PHP字符串采用UTF-8编码,那么您的表格charset必须为utf8,而collation应为utf8_general_ciutf8_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
  4. 我个人使用第三种选择,但在共享环境中,我会选择第二种选择。