MySQL非法混合使用所有utf8 db / tables / columns的排序规则

时间:2013-01-18 20:32:32

标签: mysql utf-8 character-encoding latin1

我不明白。我从来没有真正得到它,但现在我真的迷失了。我的数据库是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

出现以下错误:

  

非法混合排序(utf8_general_ci,COERCIBLE)和(latin1_swedish_ci,NUMERIC)进行操作'&lt;'

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

我知道查询并不完美,但这与现在无关。我应该可以使用''创建假/ tmp列并在HAVING中对它们进行比较,对吗?

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

1 个答案:

答案 0 :(得分:0)

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

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