четверг, 10 января 2013 г.

Asterisk и UTF-8

Как хорошо живется американцам и англичанам! Никаких проблем с раскладками клавиатуры, кодировками и т.п. А вот в условиях России борьба с кодировками - это просто вид спорта какой-то. Вчерась встал на очередные грабли при попытке писать логи астериска (cdr) в MySQL. Проблема выплывала спонтанно, и вместо русских букв в поле clid начинали появляться крокозяблы. Отладка запросов к MySQL вывела на то, что Asterisk сам менял кодировку запросов. Это, в принципе, логично - то, что не определено явно, устанавливается "по дефолту", т.е. по прихоти разработчика, а разработчику нравится кодировка latin1. Это зашито в исходниках, а вот чтобы поменять всё на UTF-8 - надо внести нужную строчку в cdr_mysql.conf:
[global]
...
charset=utf8

После перезапуска астериска все пришло в норму.

Но вот еще одна напасть - часть записей-то осталась крокозяблами! И как теперь их вернуть в нормальный читаемый вид? Ведь есть записи и с нормальной кодировкой, и их перекодировать не надо. Гугление и курение мануалов привело к рождению вот такого запроса, который одним махом приводит всё в нормальное состояние:

update cdr set clid=unhex(hex(convert(clid using latin1))) where instr(unhex(hex(convert(clid using latin1))),"?") = 0;

Причем, если по счастливой случайности строки были закодированы дважды (а у меня и такое было после экспериментов с настройками) - то повторный запуск раскодирует и их

Комментариев нет:

Отправить комментарий