Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Язык программирования MySQL

Роман Любицкий Ученик (104), открыт 3 недели назад
Подскажите пожалуйста, что это за ошибка и как ее исправить?
2 ответа
Андрей Высший разум (460580) 3 недели назад
Нормально базу данных сделать: чтобы во всех таблицах были совпадающие кодировки строк. А то у тебя в одной таблице доисторическая cp866, а в другой - столь же доисторическая cp1251. Вместо нормальных utf8 или utf8mb4.
Феникс Гуру (3628) 3 недели назад
Ошибка, которую вы видите:

```
ERROR 1267 (HY000): Illegal mix of collations (cp866_general_ci_IMPLICIT) and (cp1251_general_ci_IMPLICIT) for operation '='
```

указывает на проблему с несоответствием кодировок (collations) для двух строк, которые вы сравниваете. В данном случае одна строка использует кодировку `cp866_general_ci_IMPLICIT`, а другая — `cp1251_general_ci_IMPLICIT`. MySQL не может сравнить строки с разными кодировками напрямую, поэтому вы видите эту ошибку.

### Способы решения

1. **Явно указать кодировку для столбцов в запросе.**
Попробуйте привести обе строки к одной и той же кодировке, используя функцию `CONVERT()` или `COLLATE`. Например:
```sql
SELECT servicencik FROM service AS t1
WHERE CONVERT(t1.servicencik USING cp1251) = CONVERT(t2.servicencik USING cp1251);
```
или
```sql
SELECT servicencik FROM service AS t1
WHERE t1.servicencik COLLATE cp1251_general_ci = t2.servicencik COLLATE cp1251_general_ci;
```

2. **Проверить и изменить кодировку таблиц/столбцов.**
Если ошибка возникает из-за несовместимости кодировок в базе данных, возможно, стоит изменить кодировку столбцов на уровне таблицы:
```sql
ALTER TABLE service CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
```
Это изменит кодировку всей таблицы и может решить проблему на более глубоком уровне, особенно если несоответствие кодировок возникает часто.

3. **Изменить системную кодировку соединения.**
Если проблема возникает при подключении с разными настройками кодировки, можно попробовать установить кодировку соединения в `cp1251`:
```sql
SET NAMES 'cp1251';
```

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