2010-12-07 14 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

내 테이블 중 하나는 내 데이터베이스에 inproper utf8_general_ci' 세트'로 설정 정렬입니다시킨 것을이입니다 이유. 이 질문에 시간을내어 주셔서 감사합니다. – skalee

답변

17

,

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

또는

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

영구 수정

당신은 아마 다시 만들 데이터베이스 권한을 사용하여/같은 정렬해야

난 그냥 발견
+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