我不明白。我从来没有真正得到它,但现在我真的迷失了。我的数据库是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。救命啊!
答案 0 :(得分:0)
HAVING子句用于聚合值(想想GROUP BY项的WHERE子句)。
您需要在WHERE子句中重做计算(如ADDTIME函数),因为您无法使用别名。