MySQL 与所有 utf8 db/tables/columns 的归类非法混合

标签 mysql utf-8 character-encoding latin1

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

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

所以我想要一切都是 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

错误如下:

Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) for operation '<'

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

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

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

最佳答案

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

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

关于MySQL 与所有 utf8 db/tables/columns 的归类非法混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14407145/

相关文章:

mysql - 什么 MySQL 表设计在性能上更好?

java - 是否可以从输入流中读取单个字符?

php - 通过php显示数据库中的表

mysql - Joomla 3.8 与 MYSQL 5.6、5.7 和 8 的兼容性

mysql - 如何将具有键值对的元表作为父行加入

python - Pandas 数据框到 excel 给出 "file is not UTF-8 encoded"

python - 从 cmd.exe 运行时 Python 标准输出中的 Unicode 输出

PHP 正则表达式 - 删除所有非字母数字字符

java - 使用哪种编码来查找使用默认编码的代码?

xml - XSLT/XML : convert apostrophe to a specific entity string