我不明白。我从来没有真正得到它,但现在我真的迷路了。我的数据库是 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) 用于操作 '<'
我不明白!哪里来的latin1_swedish_ci,NUMERIC
??HAVING 中的所有部分都不是数字,它们都是相同的 utf8,对吗?源表和列是utf8!
我知道这个查询并不完美,但现在这无关紧要。我应该能够创建假/tmp 列''
并在 HAVING 中比较它们,对吗?
我真的需要我的db是utf8,因为我真的需要我的数据是utf8,因为json_encode真的需要utf8,所以我真的需要连接是utf8。帮助!