Šta je novo?

MySQL + cirilica [veliki problem]

kustera

Čuven
Učlanjen(a)
26.01.2002
Poruke
550
Poena
619
Dakle, proverio sam teme na forumu i nisam uspeo da resim problem pa sam morao da pokrenem novu temu.

Naime, imam na jednom sajtu deo za vesti. To je sve do sada islo samo latinicno, default latin1. E sad, potrebno je da se odradi da te iste vesti postoje na cirilici. Kada je cirilica u pitanju odlucio sam se za utf8. Jos neki delovi sajta su mi u bazi (delovi menija) i za sve to sam napravio forme (stranice su na utf8) i sve lepo preveo. U bazi sam ostavio latin1 i to sljaka bez problema. Problem je oko vesti.

Tekst vesti se cuva u polju tipa text i sa tim poljem imam problem. Proces unosa vesti je polu-automatski. Kad se unese neka vest rucno se poziva strana koja ce u polja da smesti cirilicnu verziju kako bi se eventualni engleski izrazi vratili na latinicu. Za prevod sam napravio mini proceduru sa str_replace naredbama za nasa slova i to radi sasvim ok. Nisam brinuo mnogo o brzini naredbi jer se vest prevodi samo jednom i cirilicna verzija se posle toga smesta u tabelu. Dakle, polja u formi su popunjena korektno (nema gresaka u prevodu) ali kad se sadrzaj ubaci u bazu sa poljem text (tipa text) imam problem. Naime, slova D i G (dakle cirilicne verzije - samo velika slova) se ne prikazuju, tj. prikazuju se kao upitnici. Napominjem, u polju varchar tipa nemam ovih problema i sve radi kako treba. Sva polja su latin1 (dakle default) jer sam probao i sa utf8 i komandom mysql_query ( "SET NAMES 'utf8';", $db ); ali dobijam samo upitnike pri prikazu podataka iz tabele.

Jel radio neko nesto ovako? Ima li iskustava i resenja? Otvoren sam za sve predloge.
 
Ukratko bih ti savetovao da sve eksportujes, pobrises tabele, napravis nove utf8 i onda vratis sadrzaj... ja sam se puno mucio u kombinacijama java+mysql i php+mysql i cim nije od pocetka utf8 svuda imao sam problema... eventualno razmisli o drugoj tabeli za cirilicu...
set names je takodje pozeljno koristiti uvek...
 
danijel00 je napisao(la):
Ukratko bih ti savetovao da sve eksportujes, pobrises tabele, napravis nove utf8 i onda vratis sadrzaj... ja sam se puno mucio u kombinacijama java+mysql i php+mysql i cim nije od pocetka utf8 svuda imao sam problema... eventualno razmisli o drugoj tabeli za cirilicu...
set names je takodje pozeljno koristiti uvek...

Cirilica i jeste u posebnoj tabeli...
Probao sam da polje bude utf8, ali tada dobijam samo upitnike.
 
Umnogome zavisi o kojoj verziji MySQL-a se radi, posto je drugacije izvedeno za 3.23, 4.0 , 4.1, itd. Neverovatno je, npr, u koliko su varijabli na serveru to podelili.

Daklem, default charset imas na nivou (DB) servera, na nivou baze, na nivou tabele i, na kraju, columna. Ti mozes uraditi nesto tipa "ALTER TABLE mojatabela DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci" i da time podaci u tabelu budu korektno smesteni, ali da ti DB server kao def char ima definisan latin1 i radi override prilikom citanja.

Pogledaj jos jednom kako je server setovan ("SHOW VARIABLES") i opcije kako da stvari promenis na toj verziji koju koristis (na nekim verzijama je dovoljno da mysqld startujes sa --default-character-set=utf8 switchom). Ukoliko je neophodno da menjas def char za bazu i/ili tabele prvo blokiraj svaki upis, uradi flush logs, uradi samu izmenu (alter database..., alter table...) i posle poteraj repair da vidis da li ce da se buni oko invalid character seta; ako se ne buni, najverovatnije je sve proslo ok.
Mada, sto rece Daniel, nekada je bilo bagova (recimo BLOB polja mogu nakon takve akcije da budu ostecena) i najsigurnije je da izbacis podatke, dropujes bazu, promenis parametre samog servera i onda kreiras bazu i tabele sa utf8 i napunis ih.
 
Kod:
character_set_client            | latin1 
character_set_connection        | latin1 
character_set_database          | latin1 
character_set_results           | latin1 
character_set_server            | latin1 
character_set_system            | utf8   
character_sets_dir              | /usr/share/mysql/charsets/
collation_connection            | latin1_swedish_ci
collation_database              | latin1_swedish_ci
collation_server                | latin1_swedish_ci
To su podesavanja sa servera. Da li ja mogu da zadrzim ta podesavanja, a da namestim da je tabela utf8 i da koristim set names kako bih korigovao prenos.
 
Pa je l' to upravo sada radis i to ne fercera?
 
silverglider je napisao(la):
Pa je l' to upravo sada radis i to ne fercera?
Dakle, radim to, tabela je utf8, odradim set names 'utf8' i sve je ok sa poljima tipa varchar, ali u polju tipa text slova Г i Д se prikazuju kao �". Stvarno ne znam sta jos moze da bude.
 
Inace, nigde nisam naveo, u pitanju je MySQL 4.1.13 na RHEL 3 masini (Ensim 4.0.3).
 
Jos jedna napomena, isto se desava sa BLOB kolonom.
 
Gde/u cemu/ prikazujes taj tekst procitan iz baze? Html, php, c/c++... forme?
 
Prvi post do prikazuje. Site je u pitanju. PHP + Smarty kombinacija.
 
Pretpostavljam da si onda namestio uft8 i u konfiguraciji web servera, u php.ini-ju, kao i u meta tagu html strane?
 
silverglider je napisao(la):
Pretpostavljam da si onda namestio uft8 i u konfiguraciji web servera, u php.ini-ju, kao i u meta tagu html strane?
Valjda je dovoljno u meta tagu html strane. Nepotrebno je da bude u apache-u i php.ini-ju jer ima sajtova koji nisu utf8.
Ali opet ponavljam, problem je samo sa TEXT tipom kolone. VARCHAR radi super.
 
Nazad
Vrh Dno