gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:50:01 29 4
gpt4 key购买 nike

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

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 客户端还有另一种编码,这使得调试变得困难。它称为“引用字符串”。

最终帮助我解决问题的是这段 PHP 代码,它接受一个 String 并将其从所有可能的编码转换为 UTF-8 并打印它。 查找正确打印字符串的行,并且存在您的字符串编码。然后,当您获得正确的编码时,使用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 程序,在正常情况下,这将是您的 web 应用程序/浏览器和 。

最佳答案

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

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

关于php - PHP MYSQL、latin1_swedish_ci 和 utf8_general_ci 的非法混合排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24887446/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com