2016-05-25 2 views
0

Я получаю следующее сообщение об ошибке из приложения Java/Spring/Hibernate, когда он пытается выполнить подготовленное заявление, в базе данных MySQL:Где находится "latin1_german1_ci" сортировка?

Caused by: java.sql.SQLException: Illegal mix of collations (latin1_swedish_ci,COERCIBLE) and (latin1_german1_ci,COERCIBLE) for operation '=' 

ЗЕЬЕСТ, который генерирует это (как показано в котом журнал) является:

SELECT s.* FROM score_items s where 
s.s_score_id_l=299 and 
(s.p_is_plu_b = 'F') and 
isTestProduct(s.p_upc_st) = 'N' and 
v_is_complete_b='T' 
order by s.nc_name_st, s.p_upc_st 

сопоставление таблицы в команде show table status является:

utf8_general_ci 

Сопоставление для всех полей char, varchar и text «utf8_general_ci». Это значение null для полей bigint, int и datetime.

сверка База данных latin1_swedish_ci, выдаваемое командой:

show variables like "collation_database"; 

Edit: Я был в состоянии успешно запустить это с моей локальной машине с помощью Eclipse,/STS и экземпляр Tomcat 6. Локальный процесс считывает из той же базы данных, что и процесс на производственном сервере, который сгенерировал ошибку. Сервер, на котором возникает ошибка, является экземпляром Tomcat 7. является сервером Amazon Linux.

Редактировать 2: Я также смог успешно запустить отчет, когда я запустил его из нашей среды QA, с оператором JDBC в server.xml reset, чтобы указать на производственную базу данных. QA, по сути, является зеркалом производственной среды, и некоторые из них работают. Следует также отметить, что в прошлом месяце я видел аналогичную ошибку, но она исчезла, когда я повторно запустил отчет. Наконец, я не уверен, почему это изменило бы ситуацию, но запрашиваемая таблица огромна: более 7 миллионов строк и, вероятно, 100 полей в строке.

Редактировать 3: На основании комментариев Тени я обнаружил, что набор символов «latin1» был указан в тестовой функции. Я изменил это на utf8 и надеюсь, что это решит проблему.

Как узнать, какое поле "latin1_german1_ci"?

Почему сравнение с использованием «latin1_swedish_ci», когда таблица и поля являются либо "utf8_general_ci или нулем?

Может проблема быть связана с функцией набора символов, и если да, то как я могу определить, какой набор символов/сортировок он использует?

Как я сузить, какое поле/функция вызывает проблему?

ответ

1

Это не имеет ничего общего с Java или спящий режим, это чисто вниз к MySQL и, возможно, в строке подключения.

В MySQL вы можете определить набор символов и порядок сопоставления на разных уровнях, что может вызвать много вопросов:

  • сервер
  • базы данных
  • таблица
  • колонка
  • соединение

См. Документацию по mysql по адресу character sets and collations для более подробной информации.

Подводя итог: более высокие значения по умолчанию используются в том и только в том случае, если на более низком уровне вы не указываете набор символов или сортировку. Таким образом, определение уровня столбца переопределяет определение уровня таблицы. Команда show table status показывает значения по умолчанию на уровне таблицы, но они, возможно, были переопределены на уровне столбца. Команды show full columns или show create table покажут вам истинные наборы символов и сопоставления, используемые для данного поля.

Определения набора символов уровня соединения/определения сортировки еще больше усложняют изображение, поскольку строковые константы, используемые в операторах sql, будут использовать набор символов/сопоставление соединений, если только они не имеют явного объявления.

Однако mysql использует значения коэрцитивности, чтобы избежать большинства проблем, возникающих в результате использования различных наборов символов и выражений, как описано в документации mysql по адресу character sets/collations used in expressions.

От вас упоминание о том, что запрос работает при выполнении с другого компьютера, указывает на то, что проблема связана с набором/сопоставлением набора символов. Я думаю, что это будет вокруг вызова isTestProduct().

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

+0

Спасибо, это очень хорошая информация. Я все еще работаю над этим. Очень странно, что он работает как с моей машиной, так и со средой QA, когда указывается на prod db (см. Мое второе редактирование выше). –

+0

Вот почему я считаю, что проблема связана со связью соединений. Вы можете указать его в строке подключения. – Shadow

+0

Я, наконец, отказался от призрака и только что перезапустил приложение, и оно сработало. Понятия не имею почему. благодаря! –

Смежные вопросы