Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Добрый день,
помогите разобраться с кавычками в ФБ, диалект 3. Нужно получить строку следующего вида:
значение что-то тут передается как параметр получается:
Почему 4-ре апострофа в конце? Получил, что называется подбором, почему так - не понимаю. код
Исправлено 2 раз(а). Последнее : DmitryKn, 03.05.23 15:01 |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
ну все просто, я же говорил уже )))
вот ваша строка:
значение в переменной lclastname (для конкретности пусть tcnalast='USER'): LASTNAME USER' поскольку кавычками обрамляется строка, то для использования одинарной кавычки внутри строки ее (эту кавычку) надо экранировать еще одной одинарной: lclastname = ' LASTNAME ''' || trim(:tcnalast) || '''' значение: LASTNAME 'USER' Исправлено 3 раз(а). Последнее : AndyNigmatec, 03.05.23 16:19 |
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Да, и то же самое в руководстве по языку. Но вот после lastname стоит 3 апострофа, после параметра - 4. Каков принцип? вот LASTNAME литерал, его обрамили по 1-му апострофу. Потом добавили кавычку - ||'' один апостроф экранирует, второй - кавычка. Т.е. всего после LASTNAME 3 апострофа, это еще как-то. А почему после параметра 4-ре? По логике 2 нужно. |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
- нет, вы не так все поняли ))) оператор || - это соединение строк, т.е. в фоксе мы пишем строка1 + строка2, а здесь строка1 || строка2 в итоге вы получаете: к строке ' LASTNAME ' вы прибавили просто пустую строку, никакого экранирования здесь нет (экранирование сработает внутри выражения выделенного одинарными кавычками) далее вы к этому выражению добавляете:
вот тут и срабатывает экранирование, в итоге ваше выражение
запишет в lclastname: LASTNAME USER' (для конкретности принял tcnalast='USER') если в lclastname вам нужно обрамление USER кавычками - то нужно и слева добавить как я и написал выше lclastname = ' LASTNAME ''' || trim(:tcnalast) || '''' или почти по вашему lclastname = ' LASTNAME ' || '''' || trim(:tcnalast) || '''' и в том и другом случае в итоге вы получите требуемое - LASTNAME 'USER' Исправлено 2 раз(а). Последнее : AndyNigmatec, 04.05.23 09:31 |
Re: Firebird, кавычки в литерале | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
Скорее всего, либо в приведенном примере ошибка, либо подставляемая переменная внутри себя содержит ведущую кавычку. Лично я "прочитал" первоначальную строку так
Текст = "Текстовая константа" + "пробел" + "значение переменной" + "закрывающая кавычка" Что в результате исходной строки получается-то? Там есть открывающая кавычка в результирующей строке? |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
так и я о том же )))
с той лишь разницей что пробела не увидел, увидел так исходный пример: Текст = "Текстовая константа" + "" + "значение переменной" + "закрывающая кавычка" |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
Судя по использованию LASTNAME - ТС добавляет/меняет пользователя в FB из процедуры/приложения - значит тут одинарные кавычки должны быть с обоих сторон
|
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Так, стало еще хуже..
здесь LASTNAME я специально отделил в строку, что бы понятнее (мне) было. Так почему их, апострофов 4-ре , а в сумме с предыдущей строкой 5 ? а здесь 3 ?
|
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
так где ж их три то, считайте - lclastname = ' LASTNAME ''' - я вижу 4
|
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Переменная кавычку не содержит, конечно. Но вот такой код работает.
|
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
я имел ввиду одну перед литералом, и 3 после. ....NAME' ' ' - вот здесь 3 почему? Исправлено 1 раз(а). Последнее : DmitryKn, 04.05.23 09:51 |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
у вас строка выделяется кавычками - вот и считайте их парно
lclastname = ' LASTNAME ''' - внешние говорят FB что между ними строка, две подряд внутренние преобразуются в один символ - одинарную кавычку |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
пишите понятно для себя:
так: lclastname = ' LASTNAME ''' || trim(:tcnalast) || '''' в переводе на фокс (для понимания) lclastname = [ LASTNAME '] + alltrim(tcnalast) + ['] Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 09:56 |
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Совершенно верно. И добавляется/меняется, но вот мне потребовалось разбить на строки команду, и я погряз в этих апострофах , не могу суть уловить. В фоксе понятно, кавычку можно отдельно представить, например так:
|
Re: Firebird, кавычки в литерале | |
---|---|
DmitryKn Автор Сообщений: 300 Дата регистрации: 06.04.2022 |
Так, с LASTNAME понятно, пара внешних, внутри кавычка и экран. Пара внешних скажет ФБ что внутри строка, а как ФБ поймет, что в переменной строка? Перед ней, получается ничего не стоит , символ кавычка относится к предыдущей строке. И в конце 4 апострофа как получились? |
Re: Firebird, кавычки в литерале | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
"Вот такой код работает" - это непонятная фраза. Как работает? Мы же не видим, что там у Вас на экране.
Если есть проблемы, то делаются последовательные тесты и смотрят, что там в итоге получается. Возможно, это какая-то фича FireBird. Или, опять же, значение переменной. Вы же упорно не говорите, что там внутри переменной. Может, реально есть ведущая кавычка?
|
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
- тип переменной посмотрит - и не скомпилирует если привести не сможет ))) - тут все то же самое - внешние говорят что внутри строка, из двух внутренних апостроф получается FB: '''' аналог в фоксе "'" Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 10:08 |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
нет, там не может быть кавычек - имена пользователей не допускаются с такими символами |
Re: Firebird, кавычки в литерале | |
---|---|
AndyNigmatec Сообщений: 1551 Откуда: Волгоград Дата регистрации: 28.06.2015 |
вот прямо сейчас в FB проверил:
дает:
т.е. все так как я и написал выше )) [attachment 36552 p1.png] [attachment 36553 p2.png] Исправлено 1 раз(а). Последнее : AndyNigmatec, 04.05.23 10:35 |
Re: Firebird, кавычки в литерале | |
---|---|
Владимир Максимов Сообщений: 14095 Откуда: Москва Дата регистрации: 02.09.2000 |
"Не допускаются", "Не может быть" и "Действительно нет. Я проверил" - это разные понятия. Как говорится, "доверяй, но проверяй". Если возникла проблема, то следует убедится, что в базе данных не записана кавычка. Т.е. в данном случае нельзя верить на слово. Надо посмотреть "глазами" и убедится, что действительно нет. |
© 2000-2024 Fox Club  |