powered by simpleCommunicator - 2.0.33     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / перекодировки и генераторы
10 сообщений из 10, страница 1 из 1
перекодировки и генераторы
    #32100557
DenJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогите новичку...
Решил тут постгрес пользовать в качестве основной субд, но сразу возник маленький вопросик относительно перекодировки: все клиенты базы пишут в базу в win1251, если я захожу в базу на сервере скажем psql -d dbase и делаю там всякие выборки, то всё русское я естесно вижу в каракулях т.к. на сервере всё же koi8-r... пробовал играться с параметрами \encoding win1251 скажем, SET CLIENT_ENCODING = 'win1251'\g и прочее, но всё это не оказывало никакого положительного эффекта :( а переменная SERVER_ENCODING вообще не ставится и в доке сказано что ставится она только на стадии initdb, что это и где это не понял...
Помогите плиз...

И еще вопросик касаемо генераторов... в свое время бился с ними в IB и MSAccess... в первом более-менее корректный выход был найдет... во втором случае всё плохо... а как обстоит дело в постгресе? Подскажите наиболее правильный способ получания уникального id... с тем чтобы его было видно по какому-нибудь sql запросу клиента... ну или вообще какие варианты?
авто-инкрементное поле точно не подойдет...

Заранее благодарен за помощь!
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32100656
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начёт первого не скажу, опыта маловато, но вероятно при установке базы устанавливается и кодировка в конфигирационном файлике.

А вот второе это очень легко, прочитай в хелпе про CREATE SEQUENCE
там всё нормальненько разъяснено и начальное значение можно задать и ещё кое что. Успехов.

Да книжечка на английском можно здесь посмотреть:
http://www.commandprompt.com/ppbook/
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32100657
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут вроде уже было :))\r
\r
/topic/14453
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32100723
DenJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ага, спасибо!

Я правда еще вчера ночью поковырял все эти "генераторы"... вроде бы всё понятно...
Единственное чего я не уяснил так это запрос SELECT следующий за INSERT'ом...
Т.е. в хелпе так написано...

И еще вопрос такой - как будет вести себя запрос типа:
insert into test values ((select nextval('test_id_seq') from test_id_seq), 'lalala', 'lalala2');
Т.е. мне бы на клиентской стороне неплохо было бы сразу получить значение select'а :-)))
Возможно ли это?

Cya!
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32101204
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что то не совсем понимаю зачем нужна вот эта кострукция:
(select nextval('test_id_seq') from test_id_seq)
Может бы кто ещё разберётся.

Мы в своём проекте делами так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE SEQUENCE klien_seq START  1 ;
CREATE SEQUENCE par_seq START  1 ;

DROP TABLE Paring;
 /*Zapros klienta iz Interneta dlja bronirovanija komnaty v otele
*/ 
CREATE TABLE Paring (
par_id INTEGER CONSTRAINT par_pk PRIMARY KEY DEFAULT NEXTVAL('par_seq'),
kliendiid INTEGER NOT NULL DEFAULT NEXTVAL('klien_seq'),
isikukood CHAR( 11 ) UNIQUE NOT NULL CHECK (isikukood ~'(^3|4|5|6)([0-9]+$)' AND Length (isikukood)= 11 ),
eesnimi VARCHAR ( 50 )  NOT NULL,
perenimi VARCHAR ( 50 ) NOT NULL,
synni_aeg DATE,
elukoht VARCHAR ( 255 ),
kuupaev DATE DEFAULT current_date,
br_algus DATE,
br_lopp DATE,
ruumiid INTEGER,
CONSTRAINT paring_ruum_fk FOREIGN KEY (ruumiID) REFERENCES Ruum(ruum_id) ON UPDATE CASCADE ON DELETE NO ACTION,
aktuaalne BOOLEAN DEFAULT FALSE
);
INSERT INTO paring(kliendikood,isikukood, eesnimi, perenimi, elukoht, synni_aeg) SELECT
kliendi_kood,isikukood, eesnimi, perenimi, elukoht, synni_aeg FROM klient;


Причём как видно из INSERT INTO мы пропускали par_id и kliendiid

Ну если что ещё попытаюсь разъяснить, а может кто это полегче делает.
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32101205
Фотография Niemi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл добавить , пропускали par_id и kliendiid
потому что они генерируются автоматом.
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32102672
DenJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы пропускали par_id и kliendiid потому как они генерируются автоматом и очевидно они вам не нужны... А мне необходимо сразу же и гарантированно получить свежесгенерированый id... :)
То есть если я сделаю некий инсерт в таблицу и затем сразу же селект этого id совсем не факт что я получу именно тот id ибо в момент времени инсертов может быть сделано вагон...
таким образом и потому что я чайник мне приходится сперва делать селект следующего в генераторе значения инкрементируя тем самым значение генератора чтобы гарантировать себе то что выбраный id уже никем не будет занят... далее уже использовать id в инсерте...
о как...
теперь с нетерпением жду классное и ГРАМОТНОЕ решение вышеописаной задачи :-)

Cya!
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32102802
SSY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаешь, разработчики Postgres такие наивные :)

Из документации по функциям (functions-sequence.html, раскраска моя):

currval

Return the value most recently obtained by nextval for this sequence in the current session. (An error is reported if nextval has never been called for this sequence in this session.) Notice that because this is returning a session-local value, it gives a predictable answer even if other sessions are executing nextval meanwhile.
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32103205
DenJS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
To: SSY

Ну хотелось бы верить в то что это действительно так :-)
Но честно говоря мне как-то боязно проверять работает ли это так как задумано :)

И вообще даже если и юзать функцию curval, то в чем собственно преимущество
select currval('table_id_seq');
перед
select nextval('table_id_seq');
?

Разница лиш в том, что в первом случае имеем возможность получить id после inserta, во втором случае до инсерта... суть имхо не меняется... или я что-то где-то недопонял?

Cya!
...
Рейтинг: 0 / 0
перекодировки и генераторы
    #32103748
SSY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Ну хотелось бы верить в то что это действительно так :-)
> Но честно говоря мне как-то боязно проверять работает ли
> это так как задумано :)

Ну, если это не так - пиши в кузницу, потому как это будет страшный баг :)

> Разница лиш в том, что в первом случае имеем возможность
> получить id после inserta, во втором случае до инсерта...
> суть имхо не меняется... или я что-то где-то недопонял?

Недопонял. Вызов currval не приводит к приращению последовательности, поэтому её можно использовать после nextval сколько угодно раз в любом месте для получения кода, сгенерированного в самый последний раз.
Промежуточная переменная для хранения этого кода здесь уже не нужна.
Это во многих случаях позволяет использовать не функцию, а простую последовательность SQL операторов.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / перекодировки и генераторы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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