ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

func_odbc и запятая

Проблемы и их решения Asterisk как такового

Модераторы: april22, Zavr2008

func_odbc и запятая

Сообщение roms » 27 июн 2016, 05:16

Добрый день всем.

Делаю извлечение имени абонента из 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.
roms
 
Сообщений: 21
Зарегистрирован: 21 дек 2015, 17:41

Re: func_odbc и запятая

Сообщение awsswa » 27 июн 2016, 07:53

начать:
настройка mysql - есть что utf-8
формат таблицы в mysql = если что про utf-8
настройки odbc идут ли с настроенным uft-8
платный суппорт по мере возможностей
awsswa
 
Сообщений: 2390
Зарегистрирован: 09 июн 2012, 10:52
Откуда: Россия, Пермь skype: yarick_perm

Re: func_odbc и запятая

Сообщение roms » 27 июн 2016, 09:06

Везде 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), и этот параметр вроде о другом.
roms
 
Сообщений: 21
Зарегистрирован: 21 дек 2015, 17:41

Re: func_odbc и запятая

Сообщение ded » 27 июн 2016, 11:12

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

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

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

Более детальному рассмотрению темы экранирования посвящена Глава 5.
https://www.opennet.ru/docs/RUS/bash_scripting_guide/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
ded
 
Сообщений: 15902
Зарегистрирован: 26 авг 2010, 19:00

Re: func_odbc и запятая

Сообщение roms » 27 июн 2016, 11:45

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!


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

Или просто никто, кроме меня не извлекает из базы текст с запятыми?
roms
 
Сообщений: 21
Зарегистрирован: 21 дек 2015, 17:41

Re: func_odbc и запятая

Сообщение ded » 27 июн 2016, 11:53

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 писал(а):Или просто никто, кроме меня не извлекает из базы текст с запятыми?
Вы ещё попробуйте записать в базу и извлекать знаки $, {}, | # и прочие спецсимволы. Развернуть дискуссию на тему как записывается и как отображается.
ded
 
Сообщений: 15902
Зарегистрирован: 26 авг 2010, 19:00

Re: func_odbc и запятая

Сообщение roms » 28 июн 2016, 03:01

Хотел наглядно показать, что запятая (везде в компьютере) не просто грамматический символ.

Капитан Очевидность?
Я и так прекрасно знаю, что запятая не просто грамматический символ.

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

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

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

Re: func_odbc и запятая

Сообщение ded » 28 июн 2016, 11:02

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

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

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

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

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

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

Re: func_odbc и запятая

Сообщение gland » 28 июн 2016, 15:57

Чем уже неделю искать ответа, проще пользоваться конкатенацией в разных вариациях и точках, если эта запятая так уж важна.
Вариантов сделать это и формировать имя из даже разных полей - вагон и маленькая тележка
gland
 
Сообщений: 115
Зарегистрирован: 25 янв 2012, 11:07

Re: func_odbc и запятая

Сообщение roms » 29 июн 2016, 05:14

Gland, я собственно так и сделал. Просто это костыль, а я не люблю использовать костыли без необходимости.

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

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

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


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

Вопрос может быть интересен тогда и только тогда, когда ответ на этот вопрос еще не найден, например, в других топиках данного форума или на других сайтах.

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

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

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


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

След.

Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH