T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
6th July

Pretvorba PHP MySQL aplikacije v PHP MS SQL aplikacijo (apache, php, mdb2, mysql => iis, php, mdb2, mssql)

Na TRSplet blogu je mogoče najti kako se preko PHP-ja povezati na MS SQL bazo, z različnimi knjižnicami ter različnimi gonilniki oz. moduli. Sedaj si poglejmo kaj je vse potrebno spremeniti, če želimo aplikacijo, ki trenutno teče na Apache PHP MySQL skladu, uspešno prenesti na IIS PHP MSSQL okolje.

V tem primeru bomo pogledali kako prenesti aplikacijo, ki za povezavo do baze uporablja MDB2 PEAR paket. Razdelimo prenos aplikacije na manjše korake.

1.) Pretvorba MySQL baze v MS SQL 2005 bazo
Na internetu je moč najti več vodičov kako to narediti, od pretvorbe po tabelah s pomočjo DTS-ja, različni programi kot naprimer MySQL-to-MSSQL converter, postopek s pomočjo online skripte. V mojem primeru sem spoznal, da se najbolje obnese program DBConvert for MS SQL & MySQL, vsaj v primeru, ko boste konverzijo opravljali večkrat. Prednosti programa so, da podpira UTF-8 v CP1250 pretvorbo, ima podporo za primarne atribute, polja kot so ENUM, SET itd. Svojo ceno pridobi že, kot recimo opravljate 2x-3x prenos na večjo bazo, ki vam lahko vzame veliko časa, s tem programom pa to zadevo opravite v nekaj sekundah.

2.) Spremembe potrebne za delovanje MDB2 PEAR paketa
V primeru, če uporabljate MDB2 pear paket z mssql gonilnikom potem boste morali vsa ntext polja spremeniti v tipa text. Žal ne gre drugače kot ročno v Microsoft SQL Server Manegment Studio Express programu, ki je na srečo brezplačen. V primeru, da polja ntext ne boste spremenili v text boste dobili sledečo napako:
Unicode data in a Unicode-only collation or ntext data cannot be sent to clients using DB-Library (such as ISQL) or ODBC version 3.7 or earlier. (severity 16)

Druga rešitev je, da namesto spremebe tipa ntext uporabite CAST funkcijo v samem querjih, naprimer:
[php]
SELECT CAST(content AS TEXT) AS content FROM page_content WHERE id=1000
[/php]
To morate narediti povsod kjer se sklicujete na tabelo, ki ima ntext polja. Če je aplikacija kompleksna lahko vzame veliko več časa kot popraviti defenicijo strukture baze. Te težave ni, če uporabljate novejšo knjižnico sqlsrv.

V primeru, da spletno stran prikazujete v UTF-8 načinu boste morali malenkostno posodobiti mssql.php gonilnik. Najprej razložimo problem. MS SQL ne podpira UTF-8 načina, zato moramo vsebino prekonvertirati v UTF-16 ali CP1250. Ker pa bi potem morali našo aplikacijo popraviti tako, da uporablja oz. pričakuje CP1250 oz. UTF-16 podatke se nam bolj splača spremeniti mssql.php gonilnik. S tem na enem mestu rešimo celoten problem in nam same aplikacije ni potrebno spreminjati, je pa pri vsaki posodobitvi MDB2 mssql knjižnice dodati naš popravek oz. hack.

MDB2 spremembe:
a) MDB2/Driver/mssql.php, v funkciji &fetchRow, pod vrstico 943 dodajte.
[php]
if (is_array($row)) {
foreach($row as $key => $value) {
$row[$key] = iconv(‘CP1250′, ‘UTF-8′, $value);
}
} else {
$row = iconv(‘CP1250′, ‘UTF-8′, $row);
}
[/php]
S tem smo rešili konverzijo podatov iz baze, sedaj moramo še rešiti konverzijo podatkov, ki grejo v bazo.

b) MDB2/Driver.mssql.php, v funkciji &_doQuery, pod vrstico 578 dodajte
[php]
$query = iconv(‘CP1250′, ‘UTF-8′, $query);
[/php]
Tako bo vsak query vseboval CP1250 podatke in ne UTF-8, ki jih pošilja aplikacija.

3.) PHP.ini spremembe
V nekaterih primerih se zgodi, da textlimit query (SET TEXTSIZE 2147483647) na Windowsih, ki ga izvršimo preko PHP-ja na MSSQL na bazo ne deluje. To potrejuje tudi php bug 26791 mssql.textlimit and mssql.textsize can’t be set via ini_set. Zato moramo v php.ini nastaviti sledeče vrednosti:

[php]
; Valid range 0 – 2147483647. Default = 4096.
mssql.textlimit = 2147483647

; Valid range 0 – 2147483647. Default = 4096.
mssql.textsize = 2147483647
[/php]

S tem zagotovimo, da bomo dobili celoten tekst iz MS SQL baze, drugače nam pri 4096 bytih vsebino odreže, kar lahko vodi v napačno strukturo aplikacije oz. napačen prikaz ter delovanje.

4.) Query spremembe
Žal je potrebno nekaj sprememb tudi pri SQL querjih, če ste uporabljali MySQL funkcije, ki niso podprte v MSSQL bazi. Poglejmo si nekaj najbolj pogostih:

  • Namesto NOW() funkcije uporabite GETDATE()
  • Namesto polje ISNULL uporabite polje=NULL oz. namesto polje NOT ISNULL uporabite polje != NULL
  • Namesto LIMIT X na koncu SQL querja boste morali uporabiti TOP X na začetku querja, po select besedi npr. SELECT
  • Namesto UNIX_TIMESTAMP(polje) boste morali uporabiti DATEDIFF(ss, ‘1/1/1970′, polje) AS polje

Več o tem lahko preberete tudi na bglog blog – Moving from MySQL to MS SQL using PEAR MDB2. V primeru, da boste potrebali kakšne dodatne informacije o tabelah, indeksih, primarnih ključih ali stolpcih uporabite INFORMATION_SCHEMA.

Delodajalec: Creatim

Ko berem tukaj se mi zdi vse skupaj zelo enostavno, ampak ko greste enkrat celoten postopek skozi, boste videli, da zna zadeva vzeti veliko več časa kot ste planirali, prav tako pa vam zna narediti kakšen siv las. Če ste vi imeli podobno izkušnjo ali imate še kakšen pameten nasvet pa nam le to sporočite pod komentarje.


Dodaj komentar

You must be logged in to post a comment.