MySQL 将排序规则与所有 utf8 db/tables/columns 非法混合

Posted

技术标签:

【中文标题】MySQL 将排序规则与所有 utf8 db/tables/columns 非法混合【英文标题】:MySQL illegal mix of collations with all utf8 db/tables/columns 【发布时间】:2013-01-02 15:34:07 【问题描述】:

我不明白。我从来没有真正得到它,但现在我真的迷路了。我的数据库是 utf8,我的表是 utf8,我的列是 utf8。有些数据是 latin1/iso-8859-1,所以它只是显示错误。 (我现在不在乎。)以前都是 latin1,现在是 50/50,更糟。

当我没有特别告诉连接使用所有 utf8 时,所有查询都有效并且所有数据都正确显示(即使存储错误)。那是因为存储错误(utf8 中的 latin1)并且连接“错误”(我猜默认为 latin1),因此相互抵消。字符正常,没有错误。但显然这是不可接受的,因为数据库包含垃圾。

所以我想要所有的utf8,所以我专门告诉mysql(每次第一次查询):

SET NAMES 'utf8' COLLATE 'utf8_general_ci'

然后不知何故以下查询失败:

SELECT
  r.id,
  r.slots,
  r.start_time AS StartA,
  ADDTIME(r.start_time, SEC_TO_TIME(60*r.slots*s.slotsize)) AS EindA,
  '14:30:00' AS StartB,
  '15:30:00' AS EindB
FROM
  club_sports s, resources c, reservations r
WHERE
  r.resource_id = c.id AND
  c.club_sport_id = s.id AND
  r.not_cancelled = '1' AND
  r.resource_id = 25 AND
  r.date = '2013-01-18'
HAVING
  (
    (StartA >= StartB AND StartA < EindB) OR
    (EindA >= StartB AND EindA < StartB) OR
    (StartB >= StartA AND StartB < EindA) OR
    (EindB >= StartA AND EindB < StartA)
  )
LIMIT 1

出现以下错误:

用于操作“

我不明白!它从哪里得到latin1_swedish_ci,NUMERIC?? HAVING 中的所有部分都不是数字,它们都是相同的 utf8,对吗?源表和列都是utf8!

我知道这个查询并不完美,但现在这无关紧要。我应该能够使用'' 创建假/tmp 列并在 HAVING 中比较它们,对吧?

我真的需要我的db是utf8,因为我真的需要我的数据是utf8,因为json_encode真的需要utf8,所以我真的需要连接是utf8。救命!

【问题讨论】:

如果你想要的只是让 json_* 工作,你所需要的只是 utf-8 连接编码 - 让数据库以 utf-8 向你发送数据,并以 utf-8 解释你的数据。仅当编码不支持您要使用的字符时,用于数据库存储的编码才重要。但除此之外,只需要连接编码就足够了。 并且查询不起作用...如果数据库不是utf8并且连接是,结果(显示)将是乱码。目前数据库和连接不是所以结果显示“正确”,但 json_encode 想要真正的 utf8。 因为您正在混合排序规则和存储字符集 我不知道那是什么意思...一切都是 utf8,应该没问题吧?为什么它会考虑某些部分latin1_swedish_ci,NUMERIC? (我什至不知道那是什么意思。)我需要SET NAMES 查询json_*。我要改变什么才能让一切正常工作? 【参考方案1】:

HAVING 子句用于聚合值(想想 GROUP BY 项的 WHERE 子句)。

您需要在 WHERE 子句中重做计算(如 ADDTIME 函数),因为您不能使用别名。

【讨论】:

这是不可接受的。该查询无需显式 utf8 排序规则查询即可工作。为什么?某处编码有问题,而不是查询。 如果我将所有 HAVING 内容移到 WHERE,它会引发完全相同的错误。它不关心 HAVING。

以上是关于MySQL 将排序规则与所有 utf8 db/tables/columns 非法混合的主要内容,如果未能解决你的问题,请参考以下文章

Mysql中的UTF-8字符集与字符集排序规则的选择

mysql建数据库的字符集与排序规则

MySQL - 新建数据库的字符集与排序规则说明

MySQL 排序规则:latin1_swedish_ci 与 utf8_general_ci

MySQL排序顺序 - 排序规则?

当所有排序规则都已经标准化时,Mysql 非法混合排序规则