2011-12-01 32 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

相關問題