Migrace MySQL 4.0 na 4.1 - jak na češtinu
29. 6. 2008 v 08.13 od Tomáš Pernica
Pro webhosting nejpoužívaj databáze MySQL přidává od verze 4.1 podporu
jazyků. Tato nová funkce však způsobuje nemalé probémy při převodu dat
z předchozí verze 4.0. Článek popisuje jednu z možností, jak provést
upgrade databáze MySQL 4.0 na 4.1 se zachováním správné diakritiky.
. Všem problematiky více znalým se omlouvám za
nepřesnosti a nedokonalosti.
Hodnocení:
Situace
Před tím, než si popíšeme postup migrace, popíšeme si důvod, proč jsem musel udělat migraci na vyšší verzi MySQL.Potřeboval jsem k redakčnímu systému webu přidat další aplikaci, která měla zakladací skripty, které byly napsané pro MySQL 4.1 a vyšší – obsahovali COLLATE cp1250_czech_cs. Redakční systém běžel zatím na verzi MySQL 4.0, která nemá podporu jazyků a tudíž nezná COLLATE.
Řešením by mohlo být vymazat COLLATE ze zakládacích skriptů nebo migrovat na MySQL 4.1. První řešení by bylo jen provizorní, protože povýšení MySQL bychom se do budoucna asi jen stěží vyhnuli. Zvolil jsem tedy povýšení MySQL ze 4.0 na 4.1. Hosting nabízí obě verze databáze. Při překopírování dat však došlo k rozhození češtiny.Jakfunguje jazyková popora
Až od verze 4.0 MySQL ukládá databáze data tak, jak přišla a neřeší v jakém kódování jsou data uložena. Od verze 4.1 byla přidáná podpora jazyků. Data jsou interně ukládána v UTF-8. Navenek komunikace ale může probíhat v libovolném jiném kódování. Kódování lze definovat až na úrovni jednotlivých sloupců (atributů) tabulky. Při komunikaci dochází k převodu, což může být kámen úrazu.Co je nutné, aby čeština fungovala správně:- U sloupců mít správně nastavené COLLATE, např. COLLATE cp1250_czech_cs.
- Po připojení správně nastavit SET CHARACTER SET, např. SET CHARACTER SET cp1250 nebo SET NAMES, např. SET NAMES cp1250.
Postup migrace
Zkoušel jsem několik různých návodů, ale nakonec jsem zvolil následující řešení:1. Na původní MySQL 4.0 provést export do SQL
K původní databázi (MySQL 4.0) jsem měl přístup pouze pomocí phpMyAdmina, což byl trošku problém, protože databáze měla 80 MB. První selhání nastalo při exportu a zazipování souboru. Nakonec se podařilo úspěšně exportovat, ale bez komprese souboru. Jelikož jsem měl v databázi uložena binární data, je ješte bych doporučil vypnout volbu „2. Doplnit COLLATE
Protože MySQL 4.0 neumí podporu jazyků, není v exportu v zakládacím skriptu použito slovo COLLATE, které je ovšem potřebné při importu do MySQL 4.1. Proto do přikazů CREATE TABLE doplníme COLLATE dle příkladu. Dle situace samozřejmě použijeme odpovídající kódování.CREATE TABLEakce(idint(11) NOT NULL auto_increment,nadpisvarchar(50) collate cp1250_czech_cs default NULL,popistinytext collate cp1250_czech_cs ,texttext collate cp1250_czech_cs ,datumdate default NULL,obrazekvarchar(100) collate cp1250_czech_cs default NULL, PRIMARY KEY (id), UNIQUE KEYid(id) ) TYPE=MyISAM AUTO_INCREMENT=392 ;
3. Na nové MySQL 4.1. provés import SQL dumpu
Nyní by se mohlo zdát, že již provedeme import pomocí phpMyAdmina a je hotovo. Není to tak jednoduché. Máme-li databázi rozumně malou, tj asi do 8 MB, není problém. Jelikož moje databáze je kolem 80 MB velká, nelze import provést pomocí phpMyAdmina, který je limitovaný velikostí uploadovaného souboru (z pravidla 2–8 MB) a také dobou běhu PHP skriptu (zpravidla 30 s).K importu mohu doporučit aplikaci SQLyog (zdarma), která běži na klientovi (na vašem PC) a připojuje se přímo na MySQL databázi (zpravidla na portu 3306). Podmínka ovšem je, že tuto možnost připojení hosting nabízí. SQLyog není nijak omezen velikosti databáze ani délkou importu.
Před importem je ještě nutné do SQL souboru přidatSET NAMES cp1250;aby databáze věděla, v jakém kódování jsou data v souboru.
Závěr
Jelikož jsem nikde nanašel postup migrace, který by mi vyhovoval a nakonec jsem si nějaký způsob našel, sepsal jsem tento návod pro ty, kteří se budou muset trápit stejně jako já. Snad jim pomůžeDalší zdroje
http://php.vrana.cz/mysql-4–1-kodovani.phpSouvisející články
Hodnocení:
