2016-02-26 61 views
0

在.sql文件我有以下幾點:MySQL的「排序規則的非法組合」使用變量從源文件

SET @campaigns = "'9c943c24-f636-11e3-98bd-02f651afdab5','7ca1cf19-f562-11e3-98bd-02f651afdab5'"; 

select * from campaigns 
    where id in (@campaigns); 

campaigns中定義爲:

CREATE TABLE `campaigns` (
    `id` varchar(36) COLLATE utf8_unicode_ci NOT NULL, 
    # column defs snipped # 
    PRIMARY KEY (`id`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

如果我連接到我的本地MySQL實例通過命令行並試圖執行上述文件:

$ mysql -h localhost -u usename -ppassword 
mysql> use mydatabase; 
mysql> source myfile.sql 

我得到以下錯誤:

ERROR 1267 (HY000): Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='

如果我改變查詢(我認爲)指定歸類:

select * from campaigns 
where id COLLATE utf8_unicode_ci in (@campaigns); 

的響應是:

Query OK, 0 rows affected (0.00 sec) Empty set (0.00 sec)

如果我把可變內容直接進入查詢:

select * from campaigns 
where id in ('9c943c24-f636-11e3-98bd-02f651afdab5','7ca1cf19-f562-11e3-98bd-02f651afdab5'); 

我得到預期的兩個結果返回。

發生了什麼事?我已經閱讀了幾個關於mysql整理和類似錯誤的stackoverflow線程,我仍然無法理解爲什麼我的變量沒有像我期望的那樣工作。

回答

1

語法不允許使用in (@campaigns),其中@campaigns是項目的一個整體。你基本上要求一個長串,而不是你希望的那樣。我不認爲有一種方法可以做你想做的(設置@variable到一個列表,然後在IN使用它。)

探討爲什麼會得到有關排序規則的錯誤,請提供

SHOW VARIABLES LIKE 'char%'; 
SHOW VARIABLES LIKE 'coll%'; 
+0

嗨 - 非常感謝。我會研究一種替代方法來完成我的IN()查詢。這裏的炭/整理設置: 'character_set_client字符\t \t utf8' '是character_set_connection \t utf8' 'character_set_database \t \t latin1' 'character_set_filesystem \t \t binary' 'character_set_results \t \t utf8' 'character_set_服務器\t \t latin1' 'character_set_system \t \t utf8' 'character_sets_dir \t \t \t /應用/甲基苯丙胺/庫/股/字符集/' 'collat​​ion_connection是\t utf8_general_ci' 'collat​​ion_database查看\t latin1_swedish_ci' 'collat​​ion_server \t latin1_swedish_ci' – Wintermute

+0

修復'IN( )'會(我認爲)使排序問題消失。 –

相關問題