Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP MYSQL、latin1_swedish_ci和utf8_general_ci排序规则的非法混合_Php_Mysql_Character Encoding - Fatal编程技术网

PHP MYSQL、latin1_swedish_ci和utf8_general_ci排序规则的非法混合

PHP MYSQL、latin1_swedish_ci和utf8_general_ci排序规则的非法混合,php,mysql,character-encoding,Php,Mysql,Character Encoding,当我尝试选择两个字符串相等的内容时,我在应用程序中遇到以下合并问题: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' 在stacktrace中,我可以看到参数Lamellt\xE4ckning,这意味着Lamelltäckning,我认为我的参数隐式地调用了la

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

SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
在stacktrace中,我可以看到参数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文件,我不知道我是否可以通过某种方式设置coalation I来解决这个问题,或者我是否需要以某种方式转换字符串

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


当我从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中插入它是没有问题的。但是当我收到post请求中的字符串时,我可以很好地回显它

 "åuuäuuö"
在数据库中,它现在像

"?uu?uu?"

mb_detect_encoding($str);
给出:
UTF-8


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

最终帮助我解决问题的是这段PHP代码,它接受一个字符串,并将其从所有可能的编码转换为UTF-8,然后打印出来<代码>查找一行,其中正确打印了字符串,并且有您对该字符串的编码。然后在获得正确编码后,使用
mb\u convert\u 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/浏览器和。

  • 尝试将PHP文件转换为UTF8
  • 数据库连接后,立即使用
    设置名称“utf8”进行查询

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

我试图在PDO连接中设置此参数,但没有帮助。谢谢你说当你收到post请求的字符串时,插入有问题。您的网页使用的编码是什么?检查它是否为UTF-8。您认为我应该将字符串转换为UTF-8是正确的。如果你想知道这是怎么做到的,请看这个问题:)有趣!谢谢分享。