2015-06-04 60 views
0

我嘗試在Grails中使用cp1251_general_ci編碼中的MySQL(支持俄語字符)。但是,當我開始我的應用程序,而bootstrap.gsp執行,我得到這個錯誤:在Grails中非法混用排序規則(cp1251_general_ci,IMPLICIT)和(latin1_swedish_ci,COERCIBLE)

2015-06-04 15:52:28,889 [localhost-startStop-1] 
    ERROR spi.SqlExceptionHelper - Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) 
    for operation '=' 

在MySQL我刪除的舊數據庫,並創造了新的要求與編碼,但我得到這個錯誤依然。 我能做些什麼來解決它?

回答

1

修復確實取決於拋出錯誤的語句。

基本上,MySQL抱怨=兩邊的表達式,即字符集/排序規則不兼容。

錯誤是由於比較兩個表達式之間的字符集不匹配造成的。

我通常運行到此錯誤,當我運行創建內嵌視圖(派生表)的聲明,和所導出的表(如預期)與客戶端連接的字符集創建,然後在外部查詢的相等比較從具有不兼容的字符集,例如一個表到列製成:

SELECT l.latin1col 
    FROM latin1table l 
    JOIN (SELECT 'utf8string' AS utf8col) s 
     ON s.utf8col = l.latin1col 

在共線視圖的列的字符集沒有被指定,因此派生表繼承來自character_set_connection可變。一種可能的解決方法是更改​​會話的變量設置。 (然後,語句運行時,在派生表中的列將是字符集。)

另一個解決辦法是指定字符集爲行內視圖,例如列

SELECT l.latin1col 
    FROM latin1table l 
    JOIN (SELECT _latin1'utf8string' AS latin1col) s 
--    ^^^^^^^ 
     ON s.latin1col = l.latin1col 

要解決你的問題,你需要找出哪些表達式是字符集,並在一側或其他適當的調整。

即,是cp1251_general_ci覈對從所述客戶端連接到來,或者是從表列。

如果您在語句中使用文字,您可以將其轉換爲合適的字符集/排序規則,以便與具有CONVERT函數的不同字符集/排序規則的列進行比較...

例如,而不是這樣的:

WHERE col = 'myliteral' 

你可以做這樣的事情:

WHERE col = CONVERT('myliteral' USING latin1) 

- - 用文字值,你也可以做到這一點

WHERE col = _latin1'myliteral' 

如果您還需要指定排序規則,您可以按照與COLLATE關鍵字和指定排序規則有效的字符集:

WHERE col = CONVERT('myliteral' USING latin1) COLLATE latin1_swedish_ci 

這不是從你的問題是什麼character_set_connectioncollation_connection變量設置爲清晰。

SELECT @@session.character_set_connection 
     , @@session.collation_connection 
     , @@global.character_set_connection 
     , @@global.collation 

還是什麼在你的數據庫中的字符列(S)的字符集和校對規則設置,

SHOW CREATE TABLE mytable; 

注:

在該字符集設置數據庫級別是默認值值應用於添加到數據庫的新表e定義了一個字符集/排序規則。

表的「默認字符集」設置是將用於未添加指定字符集/排序規則的新列的字符集。

發出語句來更改字符集像這樣的表:

ALTER TABLE mytable CHARACTER SET latin1 COLLATE latin1_swedish_ci 

改變字符集或排序規則中已有的表列中。它隻影響添加的新列,沒有指定的字符集/排序規則。同樣的事情適用於ALTER DATABASE聲明......它對現有的表和列沒有任何影響,只對新創建的表沒有指定字符集/排序規則。

+0

的'SHOW COLLATION'聲明將給予有效charactersets的列表,數據庫的排序規則。請注意,字符集可以有多個排序規則,但每個字符集都有一個* default *排序規則,在未指定排序規則時使用。另外,這裏是對MySQL CONVERT(... USING ...)語法的參考。 [https://dev.mysql.com/doc/refman/5.5/en/charset-convert.html](https://dev.mysql.com/doc/refman/5.5/en/charset-convert.html) MySQL參考手冊中有關於字符集和歸類的更多信息。 – spencer7593

0

也許我是幸運的,但我所做的是改變這一切爲nvarchar爲varchar,我得到了000webhost的服務器上的錯誤和一切工作,因爲它應該

相關問題