2010-12-07 13 views
13

MySQL'de saklı yordamım Mysql::Error: Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '=' ile başarısız olur.Saklı yordamlarda harmanlamaların geçersiz bir şekilde karıştırılması

Bu yordam, SELECT tümcesinde VARCHAR sütununu VARCHAR parametresiyle karşılaştırmayı dener.

Tablolarımdaki tüm sütunlar utf8_unicode_ci harmanlamasına sahiptir. Veritabanı harmanlaması aynıdır. /config/database.yml dosyasında harmanlama bile belirttim.

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

Ve belki de en ilginç gerçek ben bile gelen harmanlama değişkenler için sorgulama (aynı alfabe ile aynı MySQL sunucusundaki başka bir veritabanı olması: Ben /script/console çalıştırdığınızda

Ancak, şu değişkenler belirledik Rails konsolu aynı sonuçları verir) bu saklı yordamı sorunsuz bir şekilde çalıştırır.

Yardımlarınız için teşekkürler. çabuk saptamak için

+0

benim tablolardan biri benim veritabanında Inproper utf8_general_ci' seti 'ayarlı harmanlama olduğunu hangi olduğu ve bu sebep. Bu soruya zaman ayırdığınız için teşekkür ederim. – skalee

cevap

17

,

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

VEYA

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

Kalıcı düzeltme

Muhtemelen yeniden oluşturmak veritabanı hakkını kullanarak/aynı harmanlama gerekecektir

yeni öğrendim
+1

+1 Cevabınız için teşekkür ederiz. Gönderdiğiniz linkler çok kullanışlıdır ve karakter kümeleriyle ilgili elkitabında belirtilen (veya açıkça belirtilmemiş) bazı bilgiler içermektedir. Aslında, cevabınız beni dolaylı yoldan gerçek sebeplere götürdü. – skalee

+1

@ ajreal'ın cevabına ek olarak: Belki de birden çok deyim kullandığınızda, TÜM ÜLKELERIN COLLATE deyimine gereksinim duyduğunu bilmek iyidir. Yani 'SELECT * FROM YOUR_TABLE WHERE YOUR_COL1 = @ YOUR_VARIABLES1 COLLATE unicode_ci VE YOUR_COL2 = @ YOUR_VARIABLES2 COLLATE unicode_ci VE YOUR_COL3 = @ YOUR_VARIABLES3 COLLATE unicode_ci; Bunu anlamak için biraz zaman harcadım. ' – Michel

İlgili konular