簡體   English   中英

Grails中的歸類(cp1251_general_ci,IMPLICIT)和(latin1_swedish_ci,COERCIBLE)的非法混合

[英]Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) in Grails

我嘗試在Grails中以cp1251_general_ci編碼(支持俄語字符)使用MySQL。 但是,當我啟動我的應用程序時,在執行bootstrap.gsp ,出現了以下錯誤:

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中,我刪除了一個舊數據庫並使用所需的編碼創建了新數據庫,但是仍然出現此錯誤。 我該如何解決?

該修復程序實際上取決於引發錯誤的語句。

基本上,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

或將數據庫中字符列的字符集和排序規則設置為什么,

 SHOW CREATE TABLE mytable;

注意:

數據庫級別的角色集設置是默認值,該默認值應用於添加到數據庫中但未定義角色集/排序規則的新表。

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

發出一條語句來更改表的字符集,如下所示:

ALTER TABLE mytable CHARACTER SET latin1 COLLATE latin1_swedish_ci

改變對於那些已經在表中的列的字符集和校對。 它只會影響沒有指定字符集/排序規則的新添加的列。 同樣的情況適用於ALTER DATABASE語句...對現有表和列沒有任何影響,僅對創建的未指定字符集/排序規則的新表具有任何影響。

也許我很幸運,但是我所做的是將所有nvarchar都更改為varchar,我在000webhost服務器上收到錯誤,一切正常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM