Podczas tworzenia jednego z moich serwisów (www.rabatek.pl) pope?ni?em bardzo du?y b??d: zaraz po ustanowieniu po??czenia do bazy nie zmieni?em kodowania na UTF8 (domy?lnie bylo latin1). Wszystko przez to ?e po raz pierwszy postanowi?em skorzysta? z klasy PEAR::MDB2 i mi to umkn??o.
W ka?dym b?d? razie strona ju? sobie istnieje kilka miesi?cy i wszystko super dzia?a – do czasu. W wersji beta przerobi?em wyszukiwark? i okaza?o si?, ?e jak wpisz? np. “Wroc?aw” to nic nie znajduje – wszystko przez te piekielne ogonki. Baza ma ju? w tej chwili kilka tysi?cy rekordów wi?c r?czne poprawianie odpada ca?kowicie.
Z pomoc? przyszed? bardzo prosty skrypt PHP. Napisa?em go w 15 minut i nie ma w nim kontroli b??dów, komentarzy itp – po prostu wykonuje swoj? robot? i tyle.
Postanowi?em si? tym skryptem z wami podzieli? gdy? wiem ?e nie tylko ja mam problem z ogonkami.
Uwagi i komentarze mile widziane
define('DB_HOST', 'twoje_ip'); define('DB_USER', 'user_do_bazy'); define('DB_PASS', 'haslo_do_bazy'); define('DB_NAME', 'nazwa_bazy'); define('DB_CHARSET', 'UTF8'); define('DB_NAMES', 'UTF8'); define('DB_COLLATION', 'utf8_general_ci'); function chars_translate($string) { $org_letters = array('Ä…','ć','Ä™','Å‚','Å„','ó','Å›','ź','ż','Ä„','Ć','Ę','Å','Ń','Ó','Åš','Ź','Å»'); $utf8_letters = array('?','?','?','?','?','ó','?','?','?','?','?','?','?','?','Ó','?','?','?');; $string = str_replace($org_letters, $utf8_letters, $string); return $string; } $link = @mysql_connect(DB_HOST, DB_USER, DB_PASS); if (!$link) { echo "error connection to the database: ".mysql_error(); } if (!mysql_select_db(DB_NAME, $link)) { echo "error selecting a database: ".mysql_error(); } $tables = array(); // odczytaj wszystkie tabele $query = "SHOW TABLE STATUS "; $result = mysql_query($query); while ($row = mysql_fetch_assoc($result)) { if ($row['Comment'] != 'VIEW') { $tables[] = $row['Name']; } } // pobierz dane ze starych tabeli $records = array(); foreach ($tables as $table) { $query = "SELECT * FROM ".$table; $result = mysql_query($query); $records[$table] = array(); $i = 0; while($row = mysql_fetch_assoc($result)) { foreach ($row as $key => $value) { $records[$table][$i][$key] = chars_translate($value); } $i++; } } // ustaw poprawne kodowanie mysql_query("SET CHARACTER SET ".DB_CHARSET); mysql_query("SET NAMES ".DB_NAMES); mysql_query("SET collation_connection = ".DB_COLLATION); // stworz nowe tabele i wypelnij je danymi foreach ($tables as $table) { $query = "CREATE TABLE ".$table."_new LIKE ".$table; $result = mysql_query($query); if (empty($records[$table])) { continue; } $columns = implode(",", array_keys($records[$table][0])); $query = "INSERT INTO ".$table."_new (".$columns.") VALUES "; foreach ($records[$table] as $row) { $query .= "('".implode("','", $row)."'),"; } $query = substr($query, 0, -1); $result = mysql_query($query); // skasuj stara tabele $query = "DROP TABLE ".$table; $result = mysql_query($query); // zmien nazwe tabeli $query = "RENAME TABLE ".$table."_new TO ".$table; $result = mysql_query($query); echo "gotowy ".$table."\n"; flush(); } echo "KONIEC\n";
1 Trackback or Pingback for this entry
May 5th, 2010 on 10:06 pm
[...] Przeczytaj artyku?: Jak przekonwertowa? baz? danych z ogonkami na UTF8 « Artur's Blog [...]