Asterisk-CDR-Viewer-Mod icon indicating copy to clipboard operation
Asterisk-CDR-Viewer-Mod copied to clipboard

Крякозябры вместо русского Callerid(name)

Open anutator opened this issue 8 years ago • 22 comments

Использую mariadb, в etc/odbc.ini charset=utf8, /etc/my.cnf тоже настроила. Если вводить русский текст из веб-интерфейса в поле комментария, все ок, в базе из командной строки тоже хорошо отображается. А если из имени абонента- крякозябры, хотя на самом телефоне (Cisco) правильно русский отображает, когда звонок приходит. CentOS 7. Где еще копать?


[mysqld]
...
character-set-server=utf8
collation-server=utf8_unicode_ci
init-connect='SET NAMES utf8'

[client]
# default-character-set is a client option, not a server option
default-character-set=utf8

[mysql]
default-character-set=utf8

anutator avatar Jun 05 '17 17:06 anutator

Раз поле комментарий корректно отображается и сохраняется, значит существующие записи в базе не в utf8 кодировке. Попробуйте в конфиге раскомментировать строку PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'. Если опять будут отображаться крякозябры, то приведите ее к виду: PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES cp1251'. Как после этого будет отображаться...

prog-it avatar Jun 07 '17 14:06 prog-it

На одном нашем форуме нашла, что есть библиотека для юникода, а есть для анси. Обновила коннектор. Но с новым коннектором и библиотекой Астер начал вылетать, работал только когда отключала odbc соединение с базой. А так в базе появились пару раз записи нормальныe, но дублировались. Искала ошибки. Поставила из rpm самую последнюю версию базы MariaDB, ставила разные версии unixODBC. Наконец по логам докопала, что нет одной очень важной библиотеки linux-vsdo.so.1. Нет чтобы до завтра подождать. Вроде она должна быть в составе glibc. Переустановлю, думаю. Короче, никогда нельзя это делать: Rpm -ev --nodeps glibc* (не важно, какая текущая версия). После этого перестают выполняться все команды!!!! Включая установку пакетов yum. Т.к. нет еще библиотеки. Буду завтра линксоидов дергать, восстановить то надо, а то виртуалку с нуля ставить. У вас раскомментировала ранее, в базе тоже все в ютф8 перевела, правда только изучаю. Да, в 1251 бы попробовать... эх... пока восстановиться надо. Изучаю.

anutator avatar Jun 08 '17 22:06 anutator

Debian: 9 (64 bit) MariaDB: 10.1.23-MariaDB-9+deb9u1 PHP: 7.0.19-1 Asterisk: 13.14.1~dfsg-2

Тоже была проблема с отображением кириллицы в столбце "CallerID". Например: вместо - "аппарат Grandstream" выводилось - "аппарат Grandstream"

Решил проблему корректировкой файла "/etc/asterisk/cdr_mysql.conf":

[global]
hostname=localhost		; ip адрес где располагается сервер MySQL
dbname=asteriskcdrdb		; название базы данных где будут храниться cdr
table=cdr			; название таблицы
password=&&&&&&&		; пароль для пользователя asteriskuser
user=asteriskcdr		; имя пользователя для базы данных
charset=utf8mb4

Заменил "charset=utf8" на "charset=utf8mb4".

gn-pvl avatar Jul 28 '17 05:07 gn-pvl

Спасибо! Попробую когда до сервера доберусь. Даже не думала, что такой вариант есть.

anutator avatar Jul 30 '17 23:07 anutator

Странно, несколько дней было нормально. Сейчас опять крякозябры заносит в БД. По настроению как-то о_0 default

gn-pvl avatar Aug 01 '17 02:08 gn-pvl

Сегодня, 02.08.2017 не меняя настроек совершил пару тестовых звонков: default мистика, но в БД CallerID занеслось корректно.

Не понятно как так может быть, один день нормально всё, в другой - крякозябры :)

gn-pvl avatar Aug 02 '17 08:08 gn-pvl

Должно работать. Коннектор ODBC MariaDB 3.0.2. (с родным коннектором MySQL не проверяла), Asterisk 15.1.3. Сама MariaDB тоже самой последней версии, для её установки настроить репозиторий в соответствии с http://downloads.mariadb.org/mariadb/repositories/ . Иначе в CentOS 7 ставится версия 5.5. Файл /etc/my.cnf Переводим всю базу на utf8mb4 (расширенный UTF8). При изменениях в уже существующей базе перекодировать данные в utf8mb4. При создании таблицы cdr тоже должна быть эта кодировка. Для нормальной скорости работы базы данных желательно, чтобы внутри бд не нужно было ничего перекодировать. Может что-то лишнее, но главное, что работает и не вылетает. Перегрузить сервис mariadb.

[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
explicit_defaults_for_timestamp = 1 # для выключения Timestamp сообщения, может помочь
character-set-client-handshake = 0
init_connect = 'SET character_set_system = utf8mb4'
init_connect = 'SET character_set_connection = utf8mb4'
init_connect = 'SET character_set_database = utf8mb4'
init_connect = 'SET character_set_results = utf8mb4'
init_connect = 'SET collation_database = utf8mb4_unicode_ci'
init_connect = 'SET collation_connection = utf8mb4_unicode_ci'
init_connect = 'SET NAMES utf8mb4'
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

Команда для проверки кодировок в базе данных. После перезагрузок Linux и сервисов все должно быть как здесь.

MariaDB [(none)]> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+-------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

В /etc/odbc.ini

....
 UseUnicode=True

Почитать еще https://invisionbyte.ru/docs1/general/hosting/perehod-s-utf8-na-utf8mb4-v-mysql-r43/ Не проверяла.

anutator avatar Dec 17 '17 10:12 anutator

Аналогичная ситуация. Debian 9, Asterisk 13, в cdr_mysql.conf прописано charset=utf8mb4. Сперва нормально, через пару дней - кракозябры. Решил костылем, добавив в крон на каждые 10 мин запуск /usr/sbin/asterisk -rx 'reload cdr_mysql.so'

ramashkaa avatar Feb 22 '18 08:02 ramashkaa

Поставьте 15 версию, подключите как сейчас рекомендуется - через unixODBC. Сделайте как я делала: база данных — последняя версия MariaDB, коннектор родной от MariaDB. cdr_mysql.conf недостаточно, это вы кодировку только со стороны Астериска настроили, но база сама скорее всего в другой кодировке. /etc/my.cnf - настраивали?

anutator avatar Feb 22 '18 13:02 anutator

Забыла. В скрипте создания базы данных, который идет в этом архиве со статистикой, поменять utf8 на utf8mb4. К автору просьба для русского так сделать. ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Для изменения настроек кодировки только для MariaDB версии 10.3 менять не /etc/my.cnf, а vim /etc/my.cnf.d/server.cnf. Но это актуально только если несколько разных баз.

anutator avatar Oct 09 '18 14:10 anutator

Также при использовании базы MariaDB последнюю часть создания триггера чуть изменить (THEN... объединить с предыдущей строкой, чтобы MariaDB восприняла команду:

DROP TRIGGER IF EXISTS `t_cdr`;
DELIMITER //
CREATE TRIGGER `t_cdr` BEFORE INSERT ON `cdr`
 FOR EACH ROW BEGIN
	IF ((NEW.dst = 's' OR NEW.dst = '~~s~~') AND NEW.realdst != '') THEN SET NEW.dst = NEW.realdst;
	END IF;
END
//
DELIMITER ;

anutator avatar Oct 09 '18 15:10 anutator

Аналогичная проблема, только с базой cel - в БД отображаются данные в кодировке ISO-8859-1, хотя везде настроена utf-8.

  1. Насколько я понимаю, utf8 это алиас на utf8mb4, т.к. последняя уже везде используется де факто. Так что нет особого смысла писать utf8mb4 вместо utf8
  2. Почему вы вносите настройки в файл cdr_mysql.conf Это же устаревший модуль. И вы сами пишете, что используете unixODBC, который настраивается через cel_odbc.conf или cdr_adaptive_odbc.conf в случае с cdr.

В любом случае, проблема сохраняется после выполнения всех рекомендаций. Использую коннектор от mysql.

image

mammuthus avatar Apr 12 '19 06:04 mammuthus

Смотрите то что я писала. Протестирована свежая версия Asterisk, правда 15 ветки, а не 16. Самая свежая версия MariaDB, самый свежий коннектор от самой MariaDB (с их же сайта скачивала), unixODBC из исходников также самый свеженький. Все прекрасно работает. Также cel добавляла. Никаких проблем с русским.

-Почему вы вносите настройки в файл cdr_mysql.conf Это же устаревший модуль. Это другому автору. Я не использую этот модуль.

-Аналогичная ситуация. -Debian 9, Asterisk 13, в cdr_mysql.conf прописано charset=utf8mb4. Это необязательно. Во-первых, надо использовать odbc, во-вторых, со стороны Asterisk пишем utf8. utf8mb4 указываем в конфигурационном файле/файлах базы данных - либо тут /etc/my.cnf , либо конфигурация разнесена на несколько файлов:

# ls /etc/my.cnf.d
enable_encryption.preset  mysql-clients.cnf  server.cnf

У меня конфига MariaDB в /etc/my.cnf. Если будете смотреть этот файл, там ссылка на файлы из каталога /etc/my.cnf.d

Здесь решение полностью рабочее. Нужна просто внимательность и усидчивость. Проверьте в базе кодировку.

anutator avatar Apr 12 '19 08:04 anutator

В базе везде utf8, так что решение мне не подошло) В конфигах тоже везде utf8.

Тем не менее, смена драйвера на ANSI решило проблему. Но это странно, ведь у меня везде должен быть уникод, а не latin. И вывод SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; это подтверждает image

Можно поинтересоваться у вас, какая библиотека указана в качестве драйвера в конфигурации odbc? Я использовал юникодовскую libmyodbc8w, но символы стали отображаться корректно только с ANSI либой libmyodbc8a

mammuthus avatar Apr 12 '19 08:04 mammuthus

Кроме этой /usr/lib64/libmaodbc.so больше ничего. Качайте этот коннектор с сайта MariaDB. У вас какая база данных? Может не MariaDB? Тогда я не тестировала. https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.0/ конкретнее он mariadb-connector-odbc-3.1.0-rc-rhel7-x86_64.tar.gz (у меня CentOS 7). Аналогично для Debian. Остальные коннекторы не нужны.

anutator avatar Apr 12 '19 08:04 anutator

Мария, но мне было лениво собирать и я установил последний коннектор из репы Mysql. Окей, попробую родной, спасибо.

mammuthus avatar Apr 12 '19 08:04 mammuthus

Вам собирать ничего не надо. mariadb-connector-odbc-3.1.0-rc-src.tar.gz - да, тут исходники, но это надо только если для какого-то своего дистриба собирать, а для стандартного RHEL,CentOS,Debian - для них все готово, в архивах уже .so, который просто перекопировать в общий каталог где другие .so.

anutator avatar Apr 12 '19 09:04 anutator

Тогда все еще проще. Спасибо еще раз

mammuthus avatar Apr 12 '19 09:04 mammuthus

А где именно собранную либу можно взять? В mariadb-connector-odbc-3.1.0-rc-src.tar.gz нет .so файлов

mammuthus avatar Apr 12 '19 09:04 mammuthus

Я же писала выше - тут разные версии: https://downloads.mariadb.com/Connectors/odbc/connector-odbc-3.1.0/ конкретнее он mariadb-connector-odbc-3.1.0-rc-rhel7-x86_64.tar.gz (у меня CentOS 7). Аналогично для Debian.

anutator avatar Apr 12 '19 09:04 anutator

Поставила CentOS 8. Пока что для нее надо компилировать коннектор MariaDB из кода git, т.к. версия от RHEL7 не работает.

anutator avatar Oct 07 '19 11:10 anutator