09 август 2008

Debian, postgresql и сортирането на кирилицата

Тези дни се натъкнах на някакъв много странен проблем, а именно че сортировката в postgresql не работеше коректно. След обстойно проучване (абе имаше доста късмет в началото) се оказа, че причината е доста глупава, но изискваше пресъздаване на цялата инстанция.

Всъщност да почна в хронологичен ред. Инсталиране на нова машина с операционната система е debian etch, конфигурирана стандартно с български локал. Не знам защо стандартно на българския локал се слага cp1251 кодова таблица, но така или иначе това може да се промени на по-късен етап. Това успокоение ми изигра лоша шега, защото, когато по-късно сложих utf8 и разкарах cp1251, postgresql сървърът не пожела да тръгне. Стана ми странно, но за да има мир го оставих. По-късно като разгледах скриптовете за създаване на клъстер видях, че се взима локала и кодировката на конзолата и те се използват за задаване на стандартните стойности на разни параметри. До тук всичко добре, но се оказа, че ако в този клъстер създадете база с utf8 кодиране, то сортировката на кирилицата не е коректна. Като осъзнаете истината с доста наляти данни в базата, то процедурата не е много приятна, тъй като трябва да се dump-не цялата база и после да се налее отново.

Цялата тази процедура аз я извърших по следния начин. Като потребител postgres dump-нах базата посредством
pg_dumpall > db.out
След това като root спрях сървъра, премахнах клъстера, създадох го наново и стартирах сървъра
/etc/init.d/postgres stop
pg_dropcluster 8.1 main
pg_createcluster 8.1 main --locale en_US.utf8 –encoding utf8
/etc/init.d/postgres start
Като там някъде горе пропуснах и пипането на конфигурацията по новия клъстър. Накрая базата я налях през postgres потребителя.
psql -f db.out postgres
Разбира се човек може да правя всякакви вариации на този подход. Например не е нужно да изтрива наличиня клъстър, а може да се направи нов. Ако е настроил конзолата да бъде на utf8, то последните параметри при създаването на клъстъра може да ги пропусне.

1 коментар:

Ivan каза...

I have started a Bulgarian PostgreSQL User Group. You can join at

http://bgpug.collectivex.com/

Sorry for the spam :)