【问题标题】:Illegal mix of collations非法混合排序规则
【发布时间】:2011-12-01 19:53:11
【问题描述】:

首先我应该声明我的数据库不再按以下方式设计。 这纯粹是为了让之前的档案显示出来。

SELECT t.user, t.team, t.home_games_played, t.home_wins, t.home_draws, t.home_losses, t.home_points, t.home_goals_for, t.home_goals_against, 
                  t.away_games_played, t.away_wins, t.away_draws, t.away_losses, t.away_points, t.away_goals_for, t.away_goals_against, t.vacant, te.team as teamname, 
                  te.colour
                  FROM tbl_foot_leaguetables t
                  INNER JOIN tbl_foot_teams te ON t.team = te.team
                  WHERE league = '44'
                  ORDER BY t.home_points + t.away_points DESC,(t.home_goals_for + t.away_goals_for) - (t.home_goals_against + t.away_goals_against) DESC, 
                  t.home_goals_for + t.away_goals_for DESC, t.user

此查询引发以下错误

排序规则 (latin1_swedish_ci,IMPLICIT) 和 (latin1_general_ci,IMPLICIT) 用于操作 '=' 的非法混合

应该归咎于查询的以下部分

INNER JOIN tbl_foot_teams te ON t.team = te.team

它试图做的是将两个相同的单词连接在一起。

例如,“葡萄牙”到“葡萄牙”。

这是一个糟糕的设计,但我必须这样做才能得到我想要的。

现在我的数据库连接 ID 等。

任何想法如何解决这个问题?或者找到解决办法?

谢谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    排序错误。如果您查看 phpMyAdmin(我假设您有),您可以看到每个 varchar() 或其他基于字符串的存储格式的排序规则。

    这与字符编码有关。 MySQL 将根据该字符集存储数据,如果第一个字符串与另一个字符串具有不同的编码(不同的排序规则),则它不能进行二进制比较。这将对您的查询造成重大影响,这就是它拒绝的原因。

    我建议将所有排序规则值设置为相同(latin1_general_ci 很受欢迎,或者甚至可能是每个人都应该使用的utf8_general_ci)。更改排序规则通常不会影响数据,只会影响数据的存储方式。如果您将所有内容都切换为 UTF-8 (utf8_general_ci),您总是安全的

    【讨论】:

    • 难以置信,我需要了解更多!我已将 latin1_swedish_ci 更改为 general 以制作另一个。这似乎已经解决了它。干杯芽。
    • 我认为 utf8_unicode_ci 更适合国际化。我相信正确分类国际字符
    【解决方案2】:

    您的表tbl_foot_leaguetablestbl_foot_teams 具有不同的排序规则,因此无法直接比较它们的字符串值。您必须更改一个表的排序规则或使用另一个检查。

    【讨论】:

    • 从来没有遇到过这种情况!通过更改排序规则,这会改变字段中的内容并丢失数据吗?
    • 否,但您也可以使用COLLATE latin1_general_ci 为表达式中的列显式设置排序规则:dev.mysql.com/doc/refman/5.6/en/charset-collate.html
    猜你喜欢
    • 2012-08-28
    • 2011-01-20
    • 2013-08-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 2012-12-13
    相关资源
    最近更新 更多