2010-12-07 9 views
13

MySQLのストアドプロシージャがMysql::Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='で失敗します。ストアドプロシージャの照合ミスが

SELECT句でVARCHAR列とこのプロシージャに渡されたVARCHARパラメータを比較しようとすると、処理が失敗します。

テーブルのすべての列にutf8_unicode_ci照合があります。データベース照合は同じです。私は `/config/database.ymlに照合順序を指定しています。

>> ActiveRecord::Base.connection.select_rows "show variables like '%colla%'" 
=> [["collation_connection", "utf8_general_ci"], ["collation_database", "utf8_unicode_ci"], ["collation_server", "utf8_general_ci"]] 

をそしておそらく最も興味深い事実は、私もから照合変数を照会(同じ照合順序と同じMySQLサーバ上の別のデータベースを持っているということです。私は/script/consoleを実行したときに

しかし、私は次の変数が設定されていますRailsコンソールは同じ結果を出します)、このストアドプロシージャは問題なく実行されます。

ありがとうございました。クイックフィックスへ

+0

を使用して再作成し、データベースに必要になります理由。この質問に時間を費やしてくれてありがとう。 – skalee

答えて

17

SELECT * FROM YOUR_TABLE 
WHERE [email protected]_VARIABLES COLLATE utf8_general_ci; 

OR

SELECT * FROM YOUR_TABLE 
WHERE [email protected]_VARIABLES COLLATE unicode_ci; 
/* depends on the collation for YOUR_COL */ 

常設修正

あなたは、おそらく私はちょうど私のテーブルのいずれかを照合は私のデータベースにinproperある `utf8_general_ci`セットに設定されており、これがあることが判明右/同じ照合

+1

+1あなたの答えをありがとう。あなたが投稿したリンクは非常に便利で、文字セットに関連するマニュアルのセクションには、記載されていない(または明記されていない)いくつかの情報が紹介されています。実際、あなたの答えは私を間接的に本当の理由に導いてくれました。 – skalee

+1

@ ajrealの答えに加えて、多分、複数のステートメントを使用するときは、すべてのステートメントにはCOLLATEステートメントが必要であることを知っておくとよいでしょう。したがって、 'SELECT * FROM YOUR_TABLE WHERE YOUR_COL1 = @ YOUR_VARIABLES1 COLLATE unicode_ciとYOUR_COL2 = @ YOUR_VARIABLES2 COLLATE unicode_ciとYOUR_COL3 = @ YOUR_VARIABLES3 COLLATE unicode_ciになります。 私はそれを理解するためにいくつかの時間を取った。 ' – Michel

関連する問題