forum.bitel.ru
http://forum.bitel.ru/

Illegal mix of collation в истории параметра
http://forum.bitel.ru/viewtopic.php?f=22&t=11891
Страница 1 из 1

Автор:  vkulakov [ 23 авг 2016, 19:16 ]
Заголовок сообщения:  Illegal mix of collation в истории параметра

При просмотре истории спискового параметра на договоре выскочила такая ошибка:
Вложение:
Illegal mix of collations.png
Illegal mix of collations.png [ 12.4 КБ | Просмотров: 11672 ]

В логах сервера такое:
Код:
08-23/16:10:17 ERROR [http-bio-127.0.0.1-8080-exec-9] CommonExecutor - java.sql.SQLException: Illegal mix of collations for operation 'concat'
ru.bitel.bgbilling.common.BGException: java.sql.SQLException: Illegal mix of collations for operation 'concat'
    at bitel.billing.server.contract.bean.ContractParameterManager.getParameterHistory(ContractParameterManager.java:2712)
    at bitel.billing.server.contract.action.ActionGetParameterHistory.doAction(ActionGetParameterHistory.java:30)
    at bitel.billing.server.Executer.doModule(SourceFile:600)
    at bitel.billing.server.Executer$1.run(SourceFile:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at bitel.billing.server.Executer.doPost(SourceFile:193)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at ru.bitel.common.server.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:54)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.sql.SQLException: Illegal mix of collations for operation 'concat'
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1084)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4232)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4164)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2615)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2776)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2838)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2082)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2212)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
    at bitel.billing.server.contract.bean.ContractParameterManager.getParameterHistory(ContractParameterManager.java:2682)

С обновленным биллингом работаем уже месяц и никаких проблем с кодировкой замечено не было.

Автор:  dimOn [ 23 авг 2016, 19:39 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

всё из about

Автор:  vkulakov [ 23 авг 2016, 19:52 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Код:
Информация о версии:

  Клиент: вер. 6.2.826 / 24.06.2016 16:17:38
    os: Windows 7; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
  Сервер: вер. 6.2.1077 / 06.07.2016 19:20:23
    os: Linux; java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91

  assist: вер. 6.2.86 / 27.04.2016 13:58:46
  bill: вер. 6.2.87 / 10.06.2016 13:28:18
  card: вер. 6.2.39 / 26.05.2016 14:50:45
  dialup: вер. 6.2.315 / 01.03.2016 00:17:59
  email: вер. 6.2.176 / 01.03.2016 00:18:32
  inet: вер. 6.2.668 / 04.07.2016 16:59:27
  ipn: вер. 6.2.259 / 06.07.2016 19:29:33
  mps: вер. 6.2.210 / 06.07.2016 19:00:12
  npay: вер. 6.2.195 / 24.06.2016 16:25:14
  reports: вер. 6.2.209 / 06.06.2016 12:43:49
  rscm: вер. 6.2.177 / 10.06.2016 13:40:20
  ru.bitel.bgbilling.plugins.bonus: вер. 6.2.117 / 06.07.2016 18:56:27
  ru.bitel.bgbilling.plugins.crm: вер. 6.2.192 / 01.06.2016 00:38:35
  ru.bitel.bgbilling.plugins.dispatch: вер. 6.2.84 / 24.03.2016 12:20:30
  ru.bitel.bgbilling.plugins.helpdesk: вер. 6.2.181 / 14.06.2016 14:50:40
  ru.bitel.bgbilling.plugins.organizer: вер. 6.2.71 / 01.03.2016 00:18:34
  voiceip: вер. 6.2.190 / 03.03.2016 18:32:27
  wm: вер. 6.2.179 / 28.06.2016 22:32:46

Окружение:

  Клиент:
    os: Windows 7 amd64, 6.1
    java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_65
    jre home: c:\Program Files\Java\jdk1.8.0_65\jre
    default tz: 23.08.2016 16:51 MSK +0300 (Europe/Moscow)
    user tz: 23.08.2016 16:51 MSK +0300 (Europe/Moscow)
    locale: ru_RU
  Сервер:
    os: Linux amd64, 2.6.32-504.23.4.el6.x86_64
    java: Java HotSpot(TM) 64-Bit Server VM, v.1.8.0_91
    jre home: /opt/jdk1.8.0_91/jre
    default tz: 23.08.2016 16:51 MSK +0300 (Europe/Moscow)
    db time: master: 23.08.2016 16:51 MSK
    db charset: connection: cp1251(cp1251_general_ci), database: cp1251(cp1251_general_ci)
    locale: en_US
    uptime: Started: 18.08.2016 18:56:45 Uptime: 4 d 21:54:56

Третьи стороны:

  Fugue Icons. Copyright © 2011 Yusuke Kamiyamane. All rights reserved.
    http://p.yusukekamiyamane.com/
  Silk icon set. Copyright © Mark James. All rights reserved.
    http://www.famfamfam.com/lab/icons/silk/

Автор:  skn [ 24 авг 2016, 00:00 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

show create table contract_parameter_type_7_log

Автор:  vkulakov [ 24 авг 2016, 13:01 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Цитата:
CREATE TABLE `contract_parameter_type_1_log` (
`cid` int(11) NOT NULL,
`pid` int(11) NOT NULL,
`val` varchar(255) DEFAULT NULL,
`dt_change` datetime NOT NULL,
`user_id` int(11) NOT NULL,
KEY `cid_pid` (`cid`,`pid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Автор:  dimOn [ 24 авг 2016, 13:29 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

ну вот там у вас потому что DEFAULT CHARSET=latin1, но почему так получилось - тут сложно сказать.
в contract_parameter_type_7_log которую у вас попросили - тоже скорее всего то же самое, просто только с типом параметра 7 делается concat который вызывает эту проблему

Автор:  dimOn [ 24 авг 2016, 13:33 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

остальные табоицы проверьте, почему на некоторых latin1? у вас раньше была дефолт чарсет на БД такая а потом вы поменяли?

Автор:  stark [ 24 авг 2016, 13:39 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Код:
show table status

Автор:  vkulakov [ 24 авг 2016, 14:55 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Код:
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION FROM information_schema.tables WHERE table_schema = DATABASE() AND table_collation != 'cp1251_general_ci';
+--------------+-------------------------------+-------------------+
| TABLE_SCHEMA | TABLE_NAME                    | TABLE_COLLATION   |
+--------------+-------------------------------+-------------------+
| bgbilling    | billing_event_bus             | latin1_swedish_ci |
| bgbilling    | contract_comment_patterns     | latin1_swedish_ci |
| bgbilling    | contract_module               | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_1_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_3_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_4_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_5_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_6_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_7_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_8_log | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_9     | latin1_swedish_ci |
| bgbilling    | contract_parameter_type_9_log | latin1_swedish_ci |
| bgbilling    | contract_pattern_modules      | latin1_swedish_ci |
| bgbilling    | global_script                 | latin1_swedish_ci |
| bgbilling    | ip_resource_range_15          | latin1_swedish_ci |
| bgbilling    | ipn_gate_contract_port_15     | latin1_swedish_ci |
| bgbilling    | ipn_gate_rule_15              | latin1_swedish_ci |
| bgbilling    | ipn_gate_vlan_15              | latin1_swedish_ci |
| bgbilling    | login_parameter_1             | latin1_swedish_ci |
| bgbilling    | login_parameter_16            | latin1_swedish_ci |
| bgbilling    | login_parameter_log_1         | latin1_swedish_ci |
| bgbilling    | payment_robokassa             | utf8_general_ci   |
| bgbilling    | register_problem_log          | latin1_swedish_ci |
| bgbilling    | script_lib                    | latin1_swedish_ci |
| bgbilling    | sql_patches_history           | latin1_swedish_ci |
| bgbilling    | sql_template                  | latin1_swedish_ci |
| bgbilling    | tariff_option                 | latin1_swedish_ci |
+--------------+-------------------------------+-------------------+

Что было раньше и как пришли к текущему состоянию уже неизвестно.

Автор:  vkulakov [ 24 авг 2016, 20:45 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Как безопасно исправить кодировку таблиц?

Автор:  skn [ 24 авг 2016, 23:29 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

для одной таблицы, как то так...

Код:
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;


ну и проверить кодировку базы и при необходимости поменять

Код:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Автор:  dimOn [ 25 авг 2016, 13:24 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

я скрипт писал и пару баз успешно конвертнул им, где-то здесь был и кто-то исправления там делал, исходная версия на гитхабе есть: https://raw.githubusercontent.com/darkb ... ql2utf8.sh

Автор:  vkulakov [ 25 авг 2016, 13:54 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Спасибо, буду пробовать.

Автор:  vkulakov [ 06 сен 2016, 16:42 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Пытаюсь конвертить таким запросом:
Код:
ALTER TABLE billing_event_bus CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;

но реально ничего не изменяется и SHOW CREATE TABLE показывает старую кодировку. В чём может быть проблема?

Автор:  dimOn [ 06 сен 2016, 16:46 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

а запрос что возвращает?

Автор:  vkulakov [ 06 сен 2016, 16:53 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Код:
MariaDB [dcbilling]> SHOW CREATE TABLE billing_event_bus;
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table             | Create Table                                                                                                                                                                                                                                  |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| billing_event_bus | CREATE TABLE `billing_event_bus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `event` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [dcbilling]> ALTER TABLE billing_event_bus CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;           Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

MariaDB [dcbilling]> SHOW CREATE TABLE billing_event_bus;
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table             | Create Table                                                                                                                                                                                                                                  |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| billing_event_bus | CREATE TABLE `billing_event_bus` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `event` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [dcbilling]>

Автор:  dimOn [ 06 сен 2016, 16:54 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

0 rows affected (0.00 sec)
вот так не должно быть вроде как

Автор:  vkulakov [ 06 сен 2016, 17:32 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Добавил ещё запрос
Код:
ALTER TABLE billing_event_bus CHARACTER SET cp1251 COLLATE cp1251_general_ci;

и всё пошло. Т. е. помимо конвертации нужно ещё и дефолтную кодировку установить.

Автор:  dimOn [ 06 сен 2016, 17:42 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

хммм, странно

Автор:  vkulakov [ 07 сен 2016, 13:11 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

dimOn писал(а):
хммм, странно


Похоже, что дело в MariaDB. Попробовал конвертировать таблицы на тестовом биллинге с MySQL базой и после запроса
Код:
ALTER TABLE contract_parameter_type_1_log CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;

SHOW CREATE TABLE начала сразу показывать правильную кодировку.

Автор:  ok-2004 [ 07 сен 2016, 13:49 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

Мария становится всё страннее и страннее. За год метания между перконой-ораклом-марией пришёл к выводу , что Мария - конструктор, не более.
Засосать в себя все что делается другими, добавить своих красивых наработок и получить на выходе несовместимый со стоковым мускулем даже по командам DML.

А теперь по теме ТС:

Скрипт от dimOn прекрасен своей каноничностью, если не принимать во внимание изменение типа текстовых данных при такой конвертации. Как отразится на базе БЖБ при работе и обновлениях то , что CHAR/VARCHAR/TEXT/BLOB стали вдруг MEDIUM/LONGTEXT - никому не ведомо.

Если у Вас есть возможность "стопорнуть" базу - то самым правильным способом при конвертации будет использовать одну интересную фичу mysqldump при запуске с привилегиями mysql-root. Вот так например можно с cp1251 перейти на utf8:
Код:
#!/bin/bash
mysql -u root -ppassword --skip-column-names -e "SELECT table_name FROM information_schema.tables WHERE table_schema = 'bgbilling';" > /tmp/bgb_tables.txt
while read line ; do
echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "/tmp/$line"
mysqldump -uroot -ppasword \
--max_allowed_packet=100M \
--skip-opt \
--single-transaction \
--flush-logs \
--order-by-primary \
--create-options \
--quick \
--skip-set-charset \
--log-error=/tmp/$line.dump \
--skip-extended-insert \
--default-character-set=utf8 \
bgbilling $line  >> /tmp/$line
echo "show warnings;SET autocommit=1;" >> "/tmp/$line"
done < /tmp/bgb_tables.txt
#
echo "DROP DATABASE bgbilling;" > /tmp/pre_bgb.sql
echo "CREATE DATABASE bgbilling DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;" >> /tmp/pre_bgb.sql
#
mysql -uroot -ppassword  < /tmp/pre_bgb.sql
#
while read line1 ; do
sed -e 's/DEFAULT CHARSET=cp1251/DEFAULT CHARSET utf8 COLLATE utf8_unicode_ci/g' -i /tmp/$line1
mysql -uroot -ppassword -vvv --max_allowed_packet=100M  --init-command="SET NAMES utf8" bgbilling < /tmp/$line1  2>&1 > /tmp/$line1.rest
done < /tmp/bgb_tables.txt
#
exit 0


Заодно и примари-индексы перестроите и таблицы дефрагментируете. А повырезав строчки из /tmp/bgb_tables.txt перед запуском обратного процесса - избавитесь от лишних таблиц-логов.

Автор:  dimOn [ 07 сен 2016, 14:17 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

ну так-то скрипт от dimon делает то же, что делали очень многие при конвертации: просто CONVERT TO CHARACTER итд...

Автор:  vkulakov [ 07 сен 2016, 14:45 ]
Заголовок сообщения:  Re: Illegal mix of collation в истории параметра

ok-2004 писал(а):
Как отразится на базе БЖБ при работе и обновлениях то , что CHAR/VARCHAR/TEXT/BLOB стали вдруг MEDIUM/LONGTEXT - никому не ведомо.

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

Вариант с дампом всего и вся для такой простой задачи не очень интересен, да и данные из этих таблиц не очень ценны - лежат больше на всякий случай. А переводить базу на utf8 пока не планируем совсем.

Тут больше интересно другое - как я мог не заметить раньше проблему с кодировкой таблиц. Ведь историю для некоторых параметров я веду довольно давно и при включении истории всегда проверял, как это всё работает. Подозреваю, что что-то могло поломаться при переходе на MariaDB, который как раз произошёл пару месяцев назад.

Страница 1 из 1 Часовой пояс: UTC + 5 часов [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/