2011-12-01 34 views
0

首先,我应该声明我的数据库不再按照以下方式设计。 这纯粹是为了让以前的档案能够显示。非法混用排序规则

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,隐含的)的非法混合物和(latin1_general_ci,隐含的)用于操作 '='

它是以下应负责的查询的一部分

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

什么是t要做的就是加入两个完全相同的词。

例如,'葡萄牙'改为'葡萄牙'。

这是不好的设计,但我必须这样做才能得到我想要的。

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

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

谢谢。

回答

0

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

这与字符编码有关。 MySQL将根据该字符集存储数据,如果第一个字符串的编码不同于其他字符串(不同的排序规则),则不能执行二进制比较。这将是你的查询中的主要性能影响,这就是为什么它只是拒绝。

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

+0

令人难以置信的,我需要了解更多信息!我已经将latin1_swedish_ci改为一般来制作另一个。这似乎修复了它。干杯芽。 – sark9012

+0

我认为utf8_unicode_ci更适合国际。 正确地排列国际字符我相信 –

0

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

+0

您永远不会遇到过这种情况!通过改变排序规则,是否会改变现场的内容并丢失数据? – sark9012

+0

不,但您也可以使用'COLLATE latin1_general_ci'为表达式中的列明确设置排序规则:http://dev.mysql.com/doc/refman/5.6/en/charset-collat​​e.html – Viruzzo

相关问题