非法混合的排序PHP MYSQL,latin1_swedish_ci和utf8_general_ci

时间:2014-07-22 12:28:58

标签: php mysql character-encoding

当我尝试选择两个字符串相等的东西时,我在我的应用程序中遇到以下的聚合问题:

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

在堆栈跟踪中,我可以看到参数Lamellt \ xE4ckning,这意味着Lamelltäckning,我认为我的参数隐式调用了latin1_swedish_ci聚合。

我的整个数据库使用它:

DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci

当我从PHP插入字符串时,我只做一个简单的插入:

$name = "Lamelltäcke";
$db->update("insert into....");

我现在尝试使用的数据来自CSV文件,我不知道我是否可以通过某种方式设置合并或者是否需要以某种方式转换字符串来解决这个问题

这里有什么问题?我该如何解决?


当我从PHP插入数据时,它会成为一个问题。我像这样建立了pdo连接:

$db = new \PDO($dsn, $config->db_user, $config->db_pass, array(\PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

当我定义一个像

这样的字符串时
$str = "åuuäuuö";

在PHP中插入它没有问题。但是当我从一个帖子请求中收到字符串时,我可以很好地回应它

 "åuuäuuö"

在数据库中,现在它会像

一样插入
"?uu?uu?"

mb_detect_encoding($str);

给出:UTF-8


问题在于字符串本身的编码。我的数据库使用UTF-8,但编码是ISO-8859-x。为了使一切变得更糟,我的Java客户端还有另一种编码,这使得调试变得困难。它被称为“Quoted String”。

最终帮助我解决问题的是这段PHP代码,它接受一个String并将其从所有可能的编码转换为UTF-8并打印出来。 Look for a row where your string is printed correctly and there is your encoding of the string.然后,当您获得正确的编码时,使用mb_convert_encoding重新编码您的字符串。

$str = "String of unknown encoding with chars like äåö or something else";

foreach(mb_list_encodings() as $chr){
            echo mb_convert_encoding($str, 'UTF-8', $chr)." : ".$chr."\r\n";
        } 

注意是确保客户端也使用正确的编码。在我的例子中,这是一个Java程序,在正常情况下,这将是您的webapp /浏览器和。

1 个答案:

答案 0 :(得分:1)

  • 尝试将您的PHP文件转换为UTF8
  • 在数据库连接之后,使用SET NAMES 'utf8'
  • 进行查询

另外,请检查您的字段字符集是否为UTF8。

相关问题