Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) / 5 сообщений из 5, страница 1 из 1
01.04.2016, 22:40
    #39206465
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC)
Получил такую ошибку при выполнении обычного sql-запроса 'UPDATE ...'.
Посмотрел в Инете - очень много лабуды про кодировки и все не по делу.
После некоторых экспериментов и раздумий причину ошибки нашел - все дело было в коде триггера, который срабатывал при изменении таблицы:
Код: sql
1.
if IFNULL(NEW.StopDate,'0') < NEW.StartDate THEN


После изменения кода ошибка "ушла".
Но вопрос остался - почему сервер не выдает нормальную ошибку?!

Кстати, очень старая ошибка - этот запрос выдаст аналогичную ошибку:
Код: sql
1.
SELECT '0' < CURRENT_DATE()


А вот такой запрос сработает нормально:
Код: sql
1.
SELECT CURRENT_DATE() > '0'
...
Рейтинг: 0 / 0
01.04.2016, 22:43
    #39206467
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC)
Прошу прощения - MySQL 5.6.14
...
Рейтинг: 0 / 0
02.04.2016, 00:16
    #39206496
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC)
OlegROA,
какая ошибка по-твоему нормальная? NullPointerException?

ЗЫ: На правах первоапрельской шутки:
Код: sql
1.
select '0-0-0any gabarge' < CURRENT_DATE;
...
Рейтинг: 0 / 0
03.04.2016, 01:03
    #39206768
OlegROA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC)
скукотищаOlegROA,
какая ошибка по-твоему нормальная? NullPointerException?Нормальное сообщение об ошибке должно привести меня, как разработчика, максимально близко к месту возникновения ошибки и как можно точнее дать понять причину этой ошибки.
В данном случае ошибка "отсылает" меня очень-очень далеко как от самого места ее возникновения, так и в плане понятия причины этой ошибки!
Если посмотреть в Инете ссылки на подобную ошибку, то все советы по ее решению сводятся к исправлению кодировки как в настройках сервера, так и самой базы. И как это может помочь, если абсолютно везде и все настройки кодировки стоят правильные?!
Более того - как это сообщение вообще может мне помочь, если сама ошибка абсолютно не связана с кодировкой?!

Кстати, большинство советов по решению этой ошибки мне напомнили советы некоторых так называемых "компьютерных гуру", которые на элементарные проблемы в настройках ОС советуют всегда одно и тоже - переустановка системы!!!
Так и здесь - многие советы сводятся к одному - переустановка сервера с установкой правильной кодировки изначально + перезаливка данных в базе сначала в бэкап и после обратно.
...
Рейтинг: 0 / 0
03.04.2016, 01:50
    #39206773
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC)
OlegROA,

1. вам тут никто ничего не должен, ваши намеки на "так называемых"
идут нехер сразу.

2. в эмоциональном плане оценки сутуации я с вами согласен...
недавно видел такую ошибку.... в результате как-то обошел
небольшой переделкой логики (т.е. конкретно эту проблему я НЕ решил).

3. SELECT '0' < CURRENT_DATE() против
SELECT CURRENT_DATE() > '0'
вполне понятно . В первом случае дата приводится в стринг
и стравниваются два стринга. Каким-то образом стринг оказались
в разных кодировках/коллациях и получаем ошибку.
Во стором варинате первый аргумент задает тип сравнения -- дату.
'0' приводится в дату и сравниватся -- ошибки кодировки нет.

4. Почему '0' имеет одну кодировку а CURRENT_DATE()
приводится неявно к другой кодировке/коллации -- я без понятия.
Очевидно, можно отследить где что задается, толь на уровне
базы, толи, сервера, толи таблицы... или может контекста / предыдушего ДМЛ...

5. Одно из простейших (прямолинейное и некрасивое) решение,
в явном виде привести обе стороны сравнения в одну коллацию.
Вот пример из документации:

SELECT CAST(_latin1'test' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin;
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Illegal mix of collations (utf8_general_ci,COERCIBLE) and (latin1_swedish_ci,NUMERIC) / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]