Страница 1 из 2

func_odbc и запятая

Добавлено: 27 июн 2016, 04:16
roms
Добрый день всем.

Делаю извлечение имени абонента из mysql.

В диалплане (AEL):

Код: Выделить всё

Set(CALLERID(name)=${ODBC_GETNAME(${CALLERID(num)})});


В func_odbc.conf:

Код: Выделить всё

[GETNAME]
dsn=asterisk
readsql=SELECT name FROM abonents WHERE nomer='${ARG1}'
Всё извлекается красиво, но запятые при извлечении предваряются обратной косой.
При записи имени абонента как
Первый отдел, Иванов
извлекается
Первый отдел\, Иванов
Перепробовал всё, спрашивал гугл - ответа не нашел.

Кто-нибудь с похожим сталкивался?

Asterisk 11 на Debian.

Re: func_odbc и запятая

Добавлено: 27 июн 2016, 06:53
awsswa
начать:
настройка mysql - есть что utf-8
формат таблицы в mysql = если что про utf-8
настройки odbc идут ли с настроенным uft-8

Re: func_odbc и запятая

Добавлено: 27 июн 2016, 08:06
roms
Везде utf8, русский текст работает везде правильно.
Все другие знаки препинания проходят правильно, кроме ' " ,
Апостроф, кавычки и запятая предваряются обратной косой. Точка с запятой и просто точки - проходят правильно.
Запись в ту же базу текста с запятыми внутри проходит правильно. А вот при чтении - экранирование.
Полагаю, дело в не кодировке, а где-то в драйвере odbc так настроена работа с разделителями.

Есть в res_odbc.conf

Код: Выделить всё

; Many databases have a default of '\' to escape special characters.  MS SQL
; Server does not.
backslash_is_escape => no
Но у меня mysql (точнее MariaDB), и этот параметр вроде о другом.

Re: func_odbc и запятая

Добавлено: 27 июн 2016, 10:12
ded
Глава 3. Служебные символы
....
Запятая . Оператор запятая используется для вычисления серии арифметических выражений. Вычисляются все выражения, но возвращается результат последнего выражения.

let "t2 = ((a = 9, 15 / 3))" # Присваивает значение переменной "a" и вычисляет "t2".

\
escape. [обратный слэш] Комбинация \X "экранирует" символ X. Аналогичный эффект имеет комбинация с "одинарными кавычками", т.е. 'X'. Символ \ может использоваться для экранирования кавычек " и '.

Более детальному рассмотрению темы экранирования посвящена Глава 5.
https://www.opennet.ru/docs/RUS/bash_sc ... /c301.html
INNER JOIN и , (запятая) являются семантическими эквивалентами. Оба осуществляют полное объединение используемых таблиц. Способ связывания таблиц обычно задается в условии WHERE.
Опция FIELDS [OPTIONALLY] ENCLOSED BY служит для управления полями, заключенными в заданные символы. Если параметр OPTIONALLY опущен, то в выводе (SELECT ... INTO OUTFILE) все поля будут заключены в символы, заданные в ENCLOSED BY. Пример такого вывода (в котором в качестве разделителя полей используется запятая) показан ниже:

"1","a string","100.20"
"2","a string containing a , comma","102.20"
"3","a string containing a \" quote","102.20"
"4","a string containing a \", quote and comma","102.20"
Если указан параметр OPTIONALLY, то заданным в ENCLOSED BY символом выделяются только поля типа CHAR и VARCHAR:

1,"a string",100.20
2,"a string containing a , comma",102.20
3,"a string containing a \" quote",102.20
4,"a string containing a \", quote and comma",102.20
http://www.mysql.ru/docs/mysql-man-4.0- ... rence.html

Re: func_odbc и запятая

Добавлено: 27 июн 2016, 10:45
roms
https://www.opennet.ru/docs/RUS/bash_scripting_guide/c301.html
Причём тут bash?
Что, драйвер odbc Астериска через bash работает?

http://www.mysql.ru/docs/mysql-man-4.0-ru/reference.html
INNER JOIN тут тоже никуда не попадает. Если бы mysql воспринимал это как INNER JOIN, он выкидывал бы синтаксическую ошибку.


Та же самая команда:
SELECT name FROM abonents WHERE nomer='505'
поданная напрямую из mysql, или из PHP/mysqli мне возвращает текст без всяких экранирований!
А вот драйвер Asterisk обязательно вставляет backslash!


Такая проблема только у меня, у всех остальных текст с запятыми извлекается правильно?

Или просто никто, кроме меня не извлекает из базы текст с запятыми?

Re: func_odbc и запятая

Добавлено: 27 июн 2016, 10:53
ded
roms писал(а): https://www.opennet.ru/docs/RUS/bash_sc ... /c301.html

Причём тут bash?
Хотел наглядно показать, что запятая (везде в компьютере) не просто грамматический символ. От служебных особых символов трудно отвязаться.
roms писал(а): Та же самая команда:
SELECT name FROM abonents WHERE nomer='505'
поданная напрямую из mysql, или из PHP/mysqli мне возвращает текст без всяких экранирований!
А вот драйвер Asterisk обязательно вставляет backslash!
Делов то! Перепишите драйвер :) Мы же в пространстве Open Source!
roms писал(а): Или просто никто, кроме меня не извлекает из базы текст с запятыми?
Вы ещё попробуйте записать в базу и извлекать знаки $, {}, | # и прочие спецсимволы. Развернуть дискуссию на тему как записывается и как отображается.

Re: func_odbc и запятая

Добавлено: 28 июн 2016, 02:01
roms
Хотел наглядно показать, что запятая (везде в компьютере) не просто грамматический символ.
Капитан Очевидность?
Я и так прекрасно знаю, что запятая не просто грамматический символ.

Этот не просто грамматический символ правильно обрабатывается в текстовый полях mysql, и правильно обрабатывается внутри Asterisk: например если callerid задать в описании пира:
callerid="Отдел, Иванов" <101>
А при передаче из одного в другое возникает проблема.

Я хочу понять на этом форуме, как её решить.
Но либо у местных участников такой проблемы нет, либо они просто не извлекают записи с запятыми из БД.

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

Re: func_odbc и запятая

Добавлено: 28 июн 2016, 10:02
ded
Осмелюсь напомнить, с чем согласились и под чем Вы подписались, регистрируясь на форуме:
Если Вы регистрируетесь тут, чтобы первым делом написать

"Я новичок, уже третий день бьюсь, не пинайте сильно!"

то воздержитесь от регистрации либо размещайте Ваше сообщение

только в разделе "Бизнес".
Для чего нужен форум?

Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос.

Форум нужен для того, чтобы Вы САМИ опубликовали на нем ответ на вопрос, интересный многим.
Если эти очевидные формулировки для Вас неочевидны, приходится надевать китель КО.
roms писал(а):либо у местных участников такой проблемы нет, либо они просто не извлекают записи с запятыми из БД.
... либо не засовывают запятые в Caller ID Name.
roms писал(а):А ваши сообщения, Ded - бессодержательный флуд. Нечего сказать по теме - не пишите вообще.
Если можно - не создавайте глупых тем, или пишите сразу свой ответ на поставленную себе задачу. Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос. В этом и есть смысл форума.

Re: func_odbc и запятая

Добавлено: 28 июн 2016, 14:57
gland
Чем уже неделю искать ответа, проще пользоваться конкатенацией в разных вариациях и точках, если эта запятая так уж важна.
Вариантов сделать это и формировать имя из даже разных полей - вагон и маленькая тележка

Re: func_odbc и запятая

Добавлено: 29 июн 2016, 04:14
roms
Gland, я собственно так и сделал. Просто это костыль, а я не люблю использовать костыли без необходимости.

Кроме того, мне интересно: это баг или фича?

Если это баг, то хочется проверить, есть ли он в последней версии Астериска. (У меня пока времени нет, а сейчас работаю на 11).
Если есть - то надо написать производителю. Это ведь правильно, если мы не просто используем чудо буржуйской техники, а ещё и стараемся его улучшить? Разве не в этом идея упомянутого предыдущим оратором OpenSource?

А если это фича, то я хотел бы понять, почему я не нашел ответа ни в доках, ни в гугле. Это я такой дурак, искать не умею? Или оно как-то недоописано?
Предполагал, что если кто-то знает ответ, то кинет мне ссылку на мануал.


ded,
Форум нужен для того, чтобы Вы САМИ нашли ответ на свой вопрос.
Форум нужен для того, чтобы Вы САМИ опубликовали на нем ответ на вопрос, интересный многим
Вопрос может быть интересен тогда и только тогда, когда ответ на этот вопрос еще не найден, например, в других топиках данного форума или на других сайтах.
А что не так?
Моя вопрос реален? Реален. Я пытался ответить на него без этого форума? Да. Он где-то ещё описан? Я не нашел, Яндекс не нашел, Гугл не нашел. Может вы найдёте? Буду благодарен!

Вообще это правила мёртвого форума.
Ибо что бы найти ответ самому, форум не нужен. "Сам" - значит без форума.
А что бы публиковать свои ответы - форум неудобен. Для этого гораздо лучше подходят блоги, статьи на хабре, различные wiki и тд.
Форумы нужны для того, что бы подсказать человеку решение или источник информации; что бы найти решение совместными усилиями, если оно неизвестно; или что бы поделиться информацией о проблемах и/или их решениях, т.е. составить более подробную картину. Именно так я пытаюсь действовать. Если я неправ - жалуйтесь модераторам.

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


Давайте перейдём к конструктиву. Я предлагаю:
- если мой вопрос реально идиотский, ответ лежит на поверхности, а я слишком слепой или ленивый, что бы его найти: просто напишите мне об этом. И тему можно будет снести вообще.
- если вы знаете решение, но ответ требует знаний - дайте мануал или рабочий пример. Я сам разберусь.
- если вы не знаете решение, но есть версии - опять таки: изложите, я проработаю.
- а если у вас нет хотя бы толковых предположений - не пишите вообще.