powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Escape, slash, ... in arrays while INSERT/UPDATE in text type
8 сообщений из 8, страница 1 из 1
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33031803
Xlex(0x835)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, просветите, пожалуйста, совсем уже запутался и чёрт сколько времени потратил, а всё никак не могу понять:

есть запрос: "UPDATE sections SET index = '{"\\\d", "c"}' WHERE id = 5;" - почему у первого элемента массива съедаются слеши? Та же ситуация с одним и двумя слешами. Если поставить четыре слеша - то в результате в базе образуется массив вида {"\\d", "c"}, то есть с одним лишним слешем.

Подскажите, пожалуйста, где набедокурил?

Про массивы читал (http://www.postgresql.org/docs/8.0/interactive/arrays.html), и если я правильно понимаю, то я должен писать так: {"\\d", "c"} - один слеш убирается при распарсивании как строки, а второй должен доходить до массива и сохраняться в базе данных. Почему так не происходит? Такое впечатление, будто база данных воспринимается \d как некоторую escape последовательность, и слеш кушает, а букву оставляет...

Помогите, пожалуйста!
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33032484
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня на 8.0.2 четыре в два не превращаются:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create temp table sections (id int primary key, index text[]);
insert into sections (id) select i from generate_series( 1 , 5 ) s(i);
UPDATE sections SET index = '{"\d", "c"}' WHERE id =  1 ;
UPDATE sections SET index = '{"\\d", "c"}' WHERE id =  2 ;
UPDATE sections SET index = '{"\\\d", "c"}' WHERE id =  3 ;
UPDATE sections SET index = '{"\\\\d", "c"}' WHERE id =  4 ;
UPDATE sections SET index = ARRAY['\\d', 'c'] WHERE id =  5 ;
select * from sections;
id	index
 1 	{d,c}
 2 	{d,c}
 3 	{d,c}
 4 	{"\d",c}
 5 	{"\d",c}
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33032658
Xlex(0x835)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм, а у меня 8.0.1, но в истории изменений (ftp://ftp3.ru.postgresql.org/pub/mirror/postgresql/pub/source/v8.0.2/HISTORY) про это я ничего не нашёл...

Посмотрите, пожалуйста, у кого-нибудь есть возможность на 8.0.1/8.0.2 протестировать, чтобы сервер не зазря обновлять.
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33032683
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
8.0.1
Код: plaintext
1.
2.
3.
4.
5.
6.
idindex
 1  {d,c}
 2  {d,c}
 3  {d,c}
 4  {"\\d",c}
 5  {"\\d",c}
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33032707
Xlex(0x835)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей, "фффф" (оригинальное имя =), спасибо Вам большое!

Получается, что это просто бага в 8.0.1... Обойти её у меня получается используя конструкцию array[] (как говорит документация с ней и работать удобнее =).
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33035004
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня 8.0.2 под Windows ( пользовался upgrade.bat для обновления с 8.0.1)
Следующие результаты:
-
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create temp table sections (id int primary key, index text[]);
insert into sections (id) select i from generate_series( 1 , 6 ) s(i);
UPDATE sections SET index = '{"\d", "c"}' WHERE id =  1 ;
UPDATE sections SET index = '{"\\d", "c"}' WHERE id =  2 ;
UPDATE sections SET index = '{"\\\d", "c"}' WHERE id =  3 ;
UPDATE sections SET index = '{"\\\\d", "c"}' WHERE id =  4 ;
UPDATE sections SET index = ARRAY['\\d', 'c'] WHERE id =  5 ;
UPDATE sections SET index = ARRAY['\d', 'c'] WHERE id =  6 ;
select * from sections;

id  index
 1   {d,c}
 2   {d,c}
 3   {d,c}
 4   {"\\d",c}
 5   {"\\d",c}
 6   {d,c}
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33035043
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Догадался.
Давайте попробуем следующее:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create temp table sections (id int primary key, index text[]);
insert into sections (id) select i from generate_series( 1 , 6 ) s(i);
UPDATE sections SET index = '{"\d", "c"}' WHERE id =  1 ;
UPDATE sections SET index = '{"\\d", "c"}' WHERE id =  2 ;
UPDATE sections SET index = '{"\\\d", "c"}' WHERE id =  3 ;
UPDATE sections SET index = '{"\\\\d", "c"}' WHERE id =  4 ;
UPDATE sections SET index = ARRAY['\\d', 'c'] WHERE id =  5 ;
UPDATE sections SET index = ARRAY['\d', 'c'] WHERE id =  6 ;
select *,length(index[ 1 ]) from sections;
И мы получим:
Код: plaintext
1.
2.
3.
4.
5.
6.
id index    length(index[ 1 ])
 1   {d,c}       1 
 2   {d,c}       1 
 3   {d,c}       1 
 4   {"\\d",c}   2 
 5   {"\\d",c}   2 
 6   {d,c}       1 
Тут же нас осеняет и мы делаем (и получаем):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select id,index[ 1 ] from sections;
id index[ 1 ]
 1   d
 2   d
 3   d
 4   \d
 5   \d
 6   d
...
Рейтинг: 0 / 0
Escape, slash, ... in arrays while INSERT/UPDATE in text type
    #33035089
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, ввел в заблуждение общественность. Я запускал в своей программе (ZeosDBO, Delphi) и один бэкслеш при отображении пропал.
Два слеша внутри {"\\"} - так и должно быть.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Escape, slash, ... in arrays while INSERT/UPDATE in text type
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]