UTF-8 tabele, vendar latin1 podatki ter povezava
Vsem tabelam (in bazi) nastavimo UTF-8 charset (kodno tabelo):
-
CHARACTER SET utf8 COLLATE utf8_slovenian_ci
V PHP-ju nastavimo UTF-8 header:
... ali (in tudi) v HTML kodi dodamo nastavitev, ki pove brskalniku, da bodo naši podatki v UTF-8 obliki (oz. zapisu):
-
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
... in tako naredimo naš projekt UTF-8 združljiv oz. vsaj tako mislimo. Tudi meni (nam) se je to zgodilo pri cup.si. Kaj je tukaj narobe se (mogoče) sprašujete? Problem je v tem, da je privzeta vrednost za povezavo med PHP-jam in MySQL-om latin1 kodna tabela, torej podatke, ki jih pošiljamo z PHP-jem na (v) MySQL bazo so v UTF-8 obliki vendar je povezava preko katere prenesemo to vsebino v latin1 obliki, kar pomeni težave. Seveda je tudi (ponavadi) tako v obratni smeri. Rezultat, ki nam ga posreduje MySQL je privzeto v latin1 obliki.
Najprej si poglejmo kakšne vrednosti so nastavljene pri naši povezavi do baze in sicer z ukazom:
-
SHOW VARIABLES LIKE 'c%';
Rezultat je nekaj podobnega temu (prikazane so vrednost, ki so nam zanimive):
[character_set_client] => latin1
[character_set_connection]=> latin1
[character_set_results] => latin1
[collation_connection] => latin1_swedish_ci
Najlažja rešitev je, da že v konstruktor database objekta izvedete poizvedbo (query), ki nastavi povezavo in charset, ki bo uporabljen pri MySQL rezultatu na UTF-8 oz. na tisto, kar mi želimo. Primer za UTF-8 (slovenian):
Po tem nam PHP prikaže željene rezultate:
[character_set_client] => utf8
[character_set_connection]=> utf8
[character_set_results] => utf8
[collation_connection] => utf8_slovenian_ci
Kaj pa, če že imamo podatke (v latin1 kodni tabeli) v bazi in jih moramo sedaj pretvoriti v UTF-8? Rešitev je, da vsa polja, ki vsebujejo tekst (char - varchar - text - enum) spremenimo v binarno tipe, spremenimo kodno tabelo in nato spremenjena polja damo v prvotno obliko (tipe). Sicer sem že kar nekaj časa nazaj napisal svojo skripto, ampak sem danes našel še lepše napisano kodo (wodpress plugin) in zato uporabil najdeno rešitev (kodo) problema pri cup.si z malenkostnim popravkov in sicer sem dodal še collation (utf8_slovenian_ci) attribut in namesto takojšne izvajanje poizvedb (query) raje izpisal le-te na ekran. Kodo sem dodal pod priponko.
Zadeva deluje, je pa pri cup.si vseeno bilo moč najti še kakšne napake pri šumnikov in sicer sledeči znaki 'Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä', ki bi morali biti 'Ž', 'ž', 'š', 'Š', 'Č', 'č'. Ker so bili ti primeri dokaj redki, a se mi vseh tabel ni dalo popravljati na roko sem dodal še sledeči del kode, ki nadomesti vse najdene znake:
-
function convert($data, $table) {
-
$do_update = false;
-
-
foreach($data as $k => $value) {
-
$count = 0;
-
$data[$k] = str_replace(array('Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä'), array('Ž', 'ž', 'š', 'Š', 'Č', 'č'), $data[$k], $count);
-
-
if ($count> 0) {
-
$do_update = true;
-
}
-
}
-
}
-
-
if ($do_update === true) {
-
dump($query);
-
}
-
}
... s tem sem prišel do željenega rezultata ter pripravljeno skripto, ki jo lahko vzamemo tudi za druge primere (probleme), če bodo (ko bodo) ti nastopili.
Več informacij:
- MySQL charset manual
- Wordpress plugin za konvertiranje latin1 baze v UTF-8 bazo
- Konvertiranje podatke, ki so v UTF-8 obliki shranjeni v latin1 bazi
Datoteka (shranite v UTF-8 formatu !!!):
Projekt: cup.si
Delodajalec: Atelje za tisk Ines malgaj s.p. (eliteplaying)
Smo pa podoben problem imeli tudi pri KMAG-u, kjer so bili latin2 podatki shranjeni v UTF-8 tabelah (bazi) in smo jih morali pretvoriti v UTF-8 podatke (ter seveda shraniti v UTF-8 bazo). Najbrš bo v prihodnosti tega še več:P. Tukaj je potrebno omeniti, da je rešitev več, recimo uporaba hex2bin, kot je to opisano tukaj, kakšen način boste izbrali pa je odvisno od vas.
Podobni članki:
- PHP – delo z UTF-8 stringi oz. podatki – težave s šumniki (č,š,ž)
- Konverzija CP1250, ISO-8859-1 baze v UTF-8 – šumniki UTF-8 – cp1250 to utf8
- Šumniki – UTF-8 – Težave – PHP & MySQL
- Zen Cart – UTF-8 podpora – pretvorba
- MySQL kreiranje tabele s SELECT stavkom
- HTML Mime Mail PHP – nastavljanje kodne tabele (charset – windows-1250 – UTF-8) – Outlook Express
- Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
- Stalni UTF-8 problemi – utf8 mysql php – čšž šumniki težave – iskanje znaki – mysql like
- Rezanje teksta po koncu besede – php funkcija – substr – cut text – UTF-8
- PHP – Konvertiranje datotek CP1250, UTF-8 – iconv



March 4th, 2008 ob 2:02 pm
Zakaj ne uporabljas ORM-ja?
March 4th, 2008 ob 2:09 pm
Misliš za delo z bazo ali konvertiranja samega? Kater ORM imaš v mislih?
March 21st, 2008 ob 10:25 am
[...] Podatki v bazi morajo biti v UTF-8 Več informacij in konvertiranje podatkov iz latin1 v UTF-8. Struktura tabel ter baze mora ravno tako biti UTF-8, primer: PLAIN TEXT [...]
April 3rd, 2008 ob 3:39 pm
[...] UTF-8 tabele, vendar latin1 podatki ter povezava [...]
June 4th, 2008 ob 12:02 am
[...] UTF-8 tabele, vendar latin1 podatki ter povezava [...]
January 8th, 2009 ob 9:29 pm
Pozdravljeni!
Lahko še malo bolj podrobno?
Namreč na strani kjer imamm problem se v IE ne prikažer pravilno v FF pa.
Stran je http://www.triglif.
Pa da ne bom na roko vseh collationov delal me zaqnima predvsem ta korak:
"Zadeva deluje, je pa pri cup.si vseeno bilo moč najti še kakšne napake pri šumnikov in sicer sledeči znaki 'Ž', 'ž', 'Å¡', 'Å', 'ÄŒ', 'Ä', ki bi morali biti 'Ž', 'ž', 'š', 'Š', 'Č', 'č'. Ker so bili ti primeri dokaj redki, a se mi vseh tabel ni dalo popravljati na roko sem dodal še sledeči del kode, ki nadomesti vse najdene znake:"
Kamo točno se ta skripta vstavi v phpmyadminu?
Hvala vnaprej za kakršnokoli pomoč!
January 8th, 2009 ob 9:30 pm
Še tole, ko refrešam v IE, pa vse dela kakor bi moralo. torej se šum niki normalno prkažejo.
Lep pozdrav!
January 8th, 2009 ob 10:13 pm
Če hočem it na to spletno stran mi javi .. Prosimo, obiščite spletno stran kasneje.
Ponudnik spletnega gostovanja je podjetje Hitrost.com d.o.o.. Sporoči ko bo "ready", da pogledam.
January 9th, 2009 ob 4:28 pm
sori stran je http://www.triglif.si
morala bi delat...
hvala
January 9th, 2009 ob 4:43 pm
mogoče še tole za pomoč :
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server latin1
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/
collation_connection utf8_general_ci
collation_database utf8_slovenian_ci
collation_server latin1_swedish_ci
completion_type 0
concurrent_insert 1
connect_timeout 15
August 21st, 2009 ob 1:00 pm
[...] T&R Splet smo enkrat že obdelali probleme, ko imamo UTF-8 bazo, vendar v tej bazi shranjene CP1250 podatke. Vzrok tega je, da imamo nastavljeno CP1250 povezavo na [...]