SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.10.2009 12:03:22

colonel
Участник
Зарегистрирован: 20.10.2009
Сообщений: 11

Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Доброго всем времени суток, у меня проблемы с кодировками. Как избавиться от ошибки:

Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation '='

Перечитал уже много всего. Ничего не помогает. Пробовал использовать:

$conn = mysql_connect("localhost", "db_user", "xxxxxxxx") or die("Could not connect to localhost: " . mysql_error());
mysql_select_db("db_name", $conn) or die ("Can't use  db_name: " . mysql_error());
mysql_query ("SET NAMES 'CP1251'");
mysql_query ("SET CHARACTER SET 'CP1251'");

не помогло.
Вот кому необходима инфа " SHOW VARIABLES":

Variable_name     Value
character_set_client     utf8
character_set_connection     utf8
character_set_database     latin1
character_set_filesystem     binary
character_set_results     utf8
character_set_server     latin1
character_set_system     utf8
character_sets_dir     /usr/share/mysql/charsets/
collation_connection     utf8_unicode_ci
collation_database     latin1_swedish_ci
collation_server     latin1_swedish_ci


Deadangel is falling ...

Неактивен

 

#2 22.10.2009 20:08:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Подозреваю, что у вас эта ошибка в хранимой процедуре. Здесь set names уже не обойтись. Попробуйте сделать базу в cp1251.

P.S. На какой запрос он так ругается?

Неактивен

 

#3 22.10.2009 21:45:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Нее, доктор, проблема не в этом. У Вас в базе написаны данные в одной кодировке, а
сравниваете Вы с данными в другой кодировке, несовместимой с Вашей.

Конкретно — в базе данные у Вас лежат в latin1, а пытаетесь сравнивать Вы с cp1251.

Правильный способ — хранить данные в нужной кодировке или в кодировке, совместимой
с нужной (например, utf8 совместима с любыми другими кодировками).

Имеет смысл прочитать статью: http://sqlinfo.ru/articles/info/5.html
и задавать конкретные вопросы после прочтения smile

P.S. Кстати, неправильный способ — сделать SET NAMES latin1. По идее, должно заработать.
Но повторяю: лучше разобраться и сделать правильно. Чтобы потом не жалеть smile

Неактивен

 

#4 22.10.2009 22:04:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

По сообщениям в других темах у меня сложилось впечатление, что с данными все в порядке. Например, явно указывали кодировку при создании таблиц. А сейчас создали процедуру и получили все радости жизни.

Например, параметры декларированные в процедуре будут в latin1.

Неактивен

 

#5 22.10.2009 22:27:10

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Не вижу ничего про процедуру sad Или контекст из другого треда, или мне пора в отпуск smile

В данном случае я руководствовался character_set_database latin1 — если таблички создавались
без явного указания кодировок, то они создались в аккурат в latin1.

А вообще — можешь сэмулировать ситуацию, это очень легко:

Код:

[celestia] root test > create table zz (a char(1)) charset latin1;
Query OK, 0 rows affected (0.00 sec)

[celestia] root test > insert zz values ('1');
Query OK, 1 row affected (0.00 sec)

[celestia] root test > set names cp1251;
Query OK, 0 rows affected (0.00 sec)

[celestia] root test > select * from zz;
+------+
| a    |
+------+
| 1    | 
+------+
1 row in set (0.00 sec)

[celestia] root test > select * from zz where a = 'я';
ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE) for operation '='

Неактивен

 

#6 22.10.2009 22:44:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Контекст из другой темы  http://sqlinfo.ru/forum/viewtopic.php?id=1850
Товарищ как раз создавал процедуры, на базу не жаловался, а если бы данные лежали в latin1, то проблемы с большой долей вероятности были бы. Поэтому, я исходил из предположения, что данные хранятся в нормальной кодировке.

P.S. Пожалуй, я зря решил выступить в роли телепата, так как если первоначальное предположение не верно, то истину потом сложнее будет установить wink

Неактивен

 

#7 22.10.2009 22:57:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Illegal mix of collations (cp1251_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT)

Ай-ай, там длинный тред, оставляю тебе wink

Я бы начал с того, что проверил, в какой кодировке создана процедура, в INFORMATION_SCHEMA
есть, ну и пересоздал в utf8. Воизбежание.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson