Cześć!
Na moim forum, mam ustawione kodowanie języka: ISO-8859-1, w bazie danych jest: latin2_general_ci. Można po prostu przejść na UTF? Jak to zrobić?
Wersja do druku
Cześć!
Na moim forum, mam ustawione kodowanie języka: ISO-8859-1, w bazie danych jest: latin2_general_ci. Można po prostu przejść na UTF? Jak to zrobić?
Możesz przekonwertować bazę takimi programami jak: ked bądź gżegżółka
Po co? Kodowanie tabel jest teraz latin2_general_ci, więc nie ma żadnej potrzeby by to zmieniać.
Wystarczy w ACP w ustawieniach języka zmienić kodowanie z ISO-8859-1 na ISO-8859-2. Proponuję dokonać takiej zmiany dla języka polskiego i angielskiego.
Pomieszane kodowanie, nienajlepiej to wróży na przyszłość. Najwyższy czas przejść na UTF-8.
Sprawdź kodowanie bazy po obu stronach przez zapytanie SQL
Ewentualnie sprawdź możliwe zestawy znaków i metody porównańKod:SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'character_set_client';
Ustaw kodowanie dla bazy od strony serwera, bazy, tabeli, połączeniaKod:SHOW CHARACTER SET;
SHOW COLLATION LIKE 'utf8%';
Serwer (/etc/my.cnf)
Baza danychKod:[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
TabelaKod:ALTER DATABASE ... DEFAULT CHARACTER SET utf8
PołączenieKod:ALTER TABLE ... DEFAULT CHARACTER SET utf8
Teraz najlepiej posłużyć się skryptem do konwersji bazy, oczywiście wcześniej backup. Ten powinien być ok:Kod:SET NAMES 'utf8';
Zrobisz w takiej kolejności, w skrypcie daj UTF-8 i powinno hulać, o ile coś nie pokręciłem.Kod:<?php
// this script will output the queries need to change all fields/tables to a different collation
// it is HIGHLY suggested you take a MySQL dump prior to running any of the generated
// this code is provided as is and without any warranty
die("Make a backup of your MySQL database then remove this line");
set_time_limit(0);
// collation you want to change:
$convert_from = 'latin1_swedish_ci';
// collation you want to change it to:
$convert_to = 'utf8_general_ci';
// character set of new collation:
$character_set= 'utf8';
$show_alter_table = true;
$show_alter_field = true;
// DB login information
$username = 'user';
$password = 'pass';
$database = 'table';
$host = 'localhost';
mysql_connect($host, $username, $password);
mysql_select_db($database);
$rs_tables = mysql_query(" SHOW TABLES ") or die(mysql_error());
print '<pre>';
while ($row_tables = mysql_fetch_row($rs_tables)) {
$table = mysql_real_escape_string($row_tables[0]);
// Alter table collation
// ALTER TABLE `account` DEFAULT CHARACTER SET utf8
if ($show_alter_table) {
echo("ALTER TABLE `$table` DEFAULT CHARACTER SET $character_set;\r\n");
}
$rs = mysql_query(" SHOW FULL FIELDS FROM `$table` ") or die(mysql_error());
while ($row=mysql_fetch_assoc($rs)) {
if ($row['Collation']!=$convert_from)
continue;
// Is the field allowed to be null?
if ($row['Null']=='YES') {
$nullable = ' NULL ';
} else {
$nullable = ' NOT NULL';
}
// Does the field default to null, a string, or nothing?
if ($row['Default']=='NULL') {
$default = " DEFAULT NULL";
} else if ($row['Default']!='') {
$default = " DEFAULT '".mysql_real_escape_string($row['Default'])."'";
} else {
$default = '';
}
// Alter field collation:
// ALTER TABLE `account` CHANGE `email` `email` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
if ($show_alter_field) {
$field = mysql_real_escape_string($row['Field']);
echo "ALTER TABLE `$table` CHANGE `$field` `$field` $row[Type] CHARACTER SET $character_set COLLATE $convert_to $nullable $default; \r\n";
}
}
}
?>
Tak nie wątpię, ale różnie w życiu bywa, czasami trzeba zmienić serwer, skrypt, cokolwiek, wtedy najlepiej mieć wszystko w czystym UTF-8 aby uniknąć komplikacji. Problemy dotyczące kodowania chyba najczęściej pojawiają się na takich forach.
Uzylem tego skryptu z paru postow wyzej do zmiany kodowania na utf8. Dodam ze w zasadzie prawie cala baze mam juz w utf8, ale zostaly jakies niedobitki w latin1, pozostawione przez inny skrypt ktory uzylem. Tak czy inaczej powyzszy skrypt sprawil ze do czesci komorek dodaly mi sie dziwne znaczki: ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿ ½ï¿½ï¿½ï¿½ï¿½ï¿½
Np. ktos mial login Bolo, to po uzyciu skryptu ma Boloï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï ¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ i tak jest we wielu roznych miejscach, nie tylko tabeli z userami.
Czyzby to efekt ze niektore komorki/tabele byly juz w utf8 i ponowna konwersja skryptem je psuje? Jak szybko dojsc do tego ktore jeszcze nie sa w utf8 i je przerobic? W phpmyadminie na listingu tabel wszystkie sa juz w utf8_general_ci, ale z kolei jak przeszukuje recznie zrzut bazy to widze ze jest wiele pol ktore sa w latin1.
Teraz dopiero doczytałem, że w bazie niby jest latin2 :) Jeśli tak to chyba pomieszane z latin1?
Przed konwersją w bazie miałeś krzaki? Daj screena stryktury bazy, struktury tabel, polskich znaków przed konwersją, wykonaj polecenie sql:
i wklej rezultat.Kod:SHOW VARIABLES LIKE "character_set%";
Kodowanie tabel możesz zmienić komendą:
ALTER TABLE `nazwa_tabeli` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci,
DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
(nie wiem jak to się ma do wersji MySQL, którą posiadasz)
Temat stary ale problem aktualny.
U mnie też mam pomieszane kodowanie, większość to latin2_general_ci ale czasami widzę latin1_swedish_ci.
Testowałem na testowej bazie ręczną zmianę kodowania z latin1_swedish_ci na latin2_general_ci.
Mam więc pytanie czy takie ręczne zmiany są poprawną czynnością i nie odbije się to na pojawianiu się w przyszłości błędów i czy taka zmiana zostanie na stałe.
Jeżeli zostanie przeprowadzona prawidłowo - w przyszłości błędów nie będzie, a zamiana pozostanie na stałe :)