Vanhan insinööriviisauden mukaan toimivaa ei saisi korjata. Askartelin joskus MySQL-tietokantaa CentOSin päälle toimimaan PHP:n kanssa ja ihmettelin ääkkösten toimimattomuutta. Laiskana en jaksanut tietenkään tehdä muuta kuin nopean googletuksen ja laitoin PHP-koodin sekaan “SET NAMES”-rivin, jolla homma alkoi toimia. Myöhemmin sain huomata, että osalla tietokannoista oli oletusmerkistönä UTF8 ja osalla latin1. Dokumentaatiota ja ohjeita oletusmerkistön muuttamiseksi löytyi pilvin pimein, mutta jotenkin onnistuin vain saamaan itseni aina vain pahempaan sotkuun. Yksinkertaisin “korjaus” olisi ollut jättää tuo yksi SET NAMES -rivi koodin sekaan, mutta sehän olisi ollut vain laastari. Huomattavasti työläämpää, mutta palkitsevampaa oli opetella PostgreSQL ja vaihtaa se MySQL:n tilalle. Tätä varten dumppasin kaiken tiedon ulos kannasta ja varmistin, että se oli varmasti UTF8-muotoista.
MySQL:n korvaaminen aloitettiin luonnollisesti vanhan kannan pysäytyksellä ja paketin poistolla. Tämän lisäksi poistin käsin vielä hakemiston /var/lib/mysql alihakemistoineen. Kun vanha oli poistettu tieltä, oli aika asentaa PostgreSQL. Se onnistui komennolla
yum install postgresql
Paketin asennuksen yhteydessä luotiin automaagisesti käyttäjä nimeltä postgres, jolla tietokantaa ajetaan ja hallitaan. Seuraavaksi alustetaan “database cluster” eli alustetaan levylle tilaa tietokantaa varten. Samalla luodaan tietokannat postgresql ja template1. Tämä alustus tulee suorittaa postgres-käyttäjänä (tai muuna normikäyttäjänä), ei roottina! Komennolle initdb pystyy antamaan parametrin -E, jolla kerrotaan oletuksena käytettävä merkistö. Jos tätä ei anneta, oletus päätellään localesta. Koska MySQL:n puolelta oli karvaita muistoja merkistöistä, ajattelin pelata varman päälle ja määrittelin oletusmerkistön UTF8:ksi. Näin alustuskomennoksi muodostui
initdb -E UTF8
Kun alustus oli tehty, huomasin, että olin unohtanut suojata kantojen käyttämät hakemistot muilta paikallisilta käyttäjiltä. Tämän olisi voinut tehdä parametrilla -A jo alustaessa, mutta se onnistui jälkeenpäinkin muokkaamalla tiedosta pg_hba.conf. Tämä muokkaus täytyy kuitenkin tehdä ennen kuin kannan käynnistää ensimmäisen kerran. Kun tiedosto oli muokattu, käynnistettiin tietokanta roottina komennolla
service postgresql start
ja tarkistettiin vielä ps -ef:llä, että palvelua ajettiin varmasti postgres-käyttäjänä, eikä roottina.
Tämän jälkeen huomattiin, ettei yhteys kantaan toiminut html-lomakkeelta, jolta yritettiin PHP:llä lisätä tietoa kantaan. Mitään virhettä ei myöskään tullut, ennen kuin php-fpm -palvelu käynnistettiin uudelleen. Tällöin selvisi, että autentikointi kantaan epäonnistui. Tätä ihmetellessä selvisi, ettei postgres-käyttäjä olekaan sama käyttöjärjestelmässä ja kannassa. Oletuksena tietokantakäyttäjällä ei ole mitään salasanaa, jolloin yhteydenotto ulkopuolelta epäonnistuu. Niinpä mentiin kantaan kiinni psql:llä ja ajettiin SQL-lause
ALTER USER postgres WITH PASSWORD 'passu';
Kun yhteys kantaan saatiin toimimaan, jäätiin seuraavaksi kiinni POST-taulukon ihmeellisyyksiin. Jostain syystä lomakkeelta siirtyivät POSTin mukana näkyvät kentät, mutta piilotetut jäivät matkalle. Pohdin tätä jonkin aikaa kunnes tajusin, etten tarvinnut näitä piilotettuja kenttiä mihinkään vaan pystyin hoitamaan noiden kenttien täytöt suoraan tietokannassa. Tämän jälkeen datan syöttö kantaan onnistui halutusti.