gpt4 book ai didi

php - 对于与我的设置不对应的字符集,排序规则无效

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

我问过another question对于我的排序规则设置问题,它似乎被一些不需要的默认值忽略/覆盖。为了解决这个问题,我想在返回“illegal mix of collations”错误的查询中使用COLLATE。但是,当我尝试这样做时,我收到“COLLATION is not valid”错误。

有问题的查询(我在其他查询中还没有遇到这个问题),这次在参数上使用 COLLATE (? 转换为逗号字符串- 分隔的数字):

SELECT k.url 
FROM kml k
WHERE (
SELECT GROUP_CONCAT(
kat.kategorie ORDER BY kat.kategorie
)
FROM kml_kategorie kat
WHERE kat.kml = k.id
) = ? COLLATE utf8_czech_ci
LIMIT 1;

运行时,出现以下错误:

COLLATION 'utf8_czech_ci' is not valid for CHARACTER SET 'binary'

当我在 Adminer 中运行显示类似“%character_set_%”的变量时,我得到以下结果:

---------------------------------------  
| Variable_name | Value |
---------------------------------------
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
---------------------------------------

当我从 php/mysqli 调用命令时,唯一的区别是,即使 character_set_filesystem 的值为 utf8

好吧,也许在这种情况下,无论向 mysqli 显示什么,都会使用数据库设置。但后来我尝试通过将 COLLATE 添加到聚合函数 GROUP_CONCAT 来解决任何强制问题:

SELECT k.url 
FROM kml k
WHERE (
SELECT GROUP_CONCAT(
kat.kategorie ORDER BY kat.kategorie COLLATE utf8_czech_ci
)
FROM kml_kategorie kat
WHERE kat.kml = k.id
) = ?
LIMIT 1;

现在错误如下:

COLLATION 'utf8_czech_ci' is not valid for CHARACTER SET 'latin1'

可以看到字符集变量值中没有latin1。在我修改 my.cnf 文件之前,它曾经是 character_set_server 的值。它的相关部分现在看起来像这样:

## UTF 8 Settings
#init-connect=\'SET NAMES utf8\'
collation_server=utf8_czech_ci
character_set_server=utf8
character-set-filesystem=utf8
#skip-character-set-client-handshake
#character_sets-dir="C:/xampp/mysql/share/charsets"

错误消息中显示的字符集(并导致问题)来自哪里?我对从 mysqli/php 和 adminer 查询变量之间的差异感到有点困惑,并且完全对其他一些变量感到困惑,使这变得更加困惑。如何清理它并更改变量,以便至少这个 COLLATE 解决方法有效?

这基本上是 my linked question 的子问题,但差异足以值得拆分;这两个问题加起来就会像我的数据库变量一样困惑。然而,解决其中一个问题很可能也会解决另一个问题;回答后,您可以考虑通过第一个答案的摘要+说明它如何应用于问题中指定的问题来回答另一个问题。

编辑:我发现a workaround对于这一特殊情况。但是,我仍然没有找到为什么通过Adminer和Mysqli进行查询返回不同的结果以及特别是为什么错误消息指向不包含在任何变量中的字符集? p>

最佳答案

kat.kategorie 的数据类型是什么?

GROUP_CONCAT( kat.kategorie
ORDER BY CONVERT(kat.kategorie USING utf8) COLLATE utf8_czech_ci
)

您可能还需要调用CAST(... AS CHAR)

以后不要混合使用字符集。

GROUP_CONCAT 以及其他几个涉及组合事物的函数在推断结果类型应该是什么时存在问题。在某些情况下,它会转换并调用结果 BINARY,这比您遇到的情况更糟糕。

我相信某个 latin1 导致了您的特定问题。深入了解管理员。让我们看看 SHOW CREATE TABLE kat。

关于php - 对于与我的设置不对应的字符集,排序规则无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28873538/

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