| Zadając pytanie dotyczące PHPNuke podaj jego wersje!! |
| Znaki zapytania zamiast polskich liter |
Jeżeli na twojej stronie, która odczytuje dane z MySQL pojawiły się znaki zapytania zamaist polskich liter (ą, ś, ć, itp.) to prawdopodobnie strona oparta na PHP-Nuke łączy się do bazy z innym zestawem znaków, jaki ma serwer, z którego korzystasz.
Podsumowując:
1) klient (PHP-Nuke) łączy sie z bazą, mając swój zestaw znaków,
2) baza danych ma również swój zestaw znaków.
Co zrobić, aby wyświetlały się polskie znaki?
Spróbuję wyjaśnić to najprościej jak mi się uda.
I. Krok pierwszy:
Wejdź do phpMyAdmina i wykonaj zapytanie SQL:
| Kod: |
| SHOW VARIABLES LIKE "character_set%"; |
odczytaj wartość character_set_client, character_set_connection, character_set_database i charcter_set_server
Jeżeli wartości są takie same, to nie powinieneś mieć tego problemu, a jeśli się różnią to musimy przejść do kroku drugiego. lub trzeciego, w zależności w jakiej sytuacji jesteś.
II. Krok drugi:
1) Jeżeli nasze tabele mają inny zestaw znaków niż domyślny, który odczytaliśmy z character_set_database, to musimy:
- wymusić łączenie się z takim charsetem, jaki ma tablica, dodając po połączeniu polecenie "SET NAMES 'latin1'", gdzie 'latin1', to zestaw znaków z naszych tabelach.
Jak to zrobić?
otwieramy plik includes/sql_layer.php
Szukamy
| Kod: |
function sql_connect($host, $user, $password, $db)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db); |
i dodajemy po:
| Kod: |
| mysql_query("set names 'latin1'",$dbi); |
Otwórz plik db/mysql.php
Znajdź
| Kod: |
mysql_connect($this->server, $this->user, $this->password);
}
if($this->db_connect_id)
{
if($database != "")
{
$this->dbname = $database;
$dbselect = @mysql_select_db($this->dbname); |
dodaj po:
| Kod: |
| mysql_query("set names 'latin1'",$this->db_connect_id); |
Pamiętaj, że musisz zamienić latin1, na zestaw znaków, któy mają twoje tabele
- spróbować zmienić kodowanie w tablicy, tak aby serwer nie robił "automatycznej konwersji w locie".
Zmiana kodowania w tablicy - WAŻNE!
Ponieważ nasze znaki są w tabeli jako strona kodowa domyslnej tablicy znaków w naszej bazie danych, a tabela uważa, że są one w latin1, NIE WOLNO robić zwykłej konwersji charsetu na danym polu (przez ALTER TABLE - zmiana właściwości pola)!
Trzeba z każdym polem typu text lub varchar zrobić tak, jak to niżej napisali:
| Kod: |
If you have a column in one character set (like latin1) but the stored values actually use some other, incompatible character set (like utf8). In this case, you have to do the following for each such column:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
|
a w naszym przypadku, zamiast uft8, będzie domyślny zestaw znaków naszej bazy danych
| Kod: |
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET latin2;
|
dla pola VARCHAR będzie to:
| Kod: |
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 VARCHAR(255) CHARACTER SET latin2;
|
Uwaga: 'latin2' musisz zmienic na swoją domyślną tablicę znaków w twoim MySQL
III. Krok trzeci:
Jeśli nasz przypadek to:
1) baza ma domyślny zestaw znaków, np. 'latin2'
2) PHP-Nuke łączy się za pomocą innego zestawu znaków, np. 'latin1' , to:
otwieramy plik includes/sql_layer.php
Szukamy
| Kod: |
function sql_connect($host, $user, $password, $db)
{
global $dbtype;
switch ($dbtype) {
case "MySQL":
$dbi=@mysql_connect($host, $user, $password);
mysql_select_db($db); |
i dodajemy po:
| Kod: |
| mysql_query("set names 'latin2'",$dbi); |
Otwórz plik db/mysql.php
Znajdź
| Kod: |
mysql_connect($this->server, $this->user, $this->password);
}
if($this->db_connect_id)
{
if($database != "")
{
$this->dbname = $database;
$dbselect = @mysql_select_db($this->dbname); |
dodaj po:
| Kod: |
| mysql_query("set names 'latin2'",$this->db_connect_id); |
gdzie musimy 'latin2' zmienić na zestaw znaków naszej bazy dnaych
Przy opracowywaniu wykorzystałem http://www.zhr.pl/info/1657
Dodał Srwsio
W większości przypadków pomaga również odnalezienie w plikach słowa
i zaspąpienie go słowem
UPDATE:
Alternatywną metoda działającą w niektórych przypadkach (zwłaszcza opisanej powyżej drugiej sytuacji) to konwersja standardu kodowania w pliku będącym zrzutem bazy danych.
Otóż przed wykonaniem zapytań z pliku sql należy zmienić kodowanie w tym pliku na zgodne z kodowaniem jaki poznaliśmy na początku tego FAQ. Dopiero potem załadować plik do bazy danych. Do konwersji standardu kodowania polecam darmowy, polski program o nazwie GżegżółkaXP. Najczęściej konwersja powinna być wykonana na któryś z tych 3 standardów:
- IBM CP852 (Europa Środkowa)
- ISO 8859-2 (Europa Środkowa)
- Windows 1250 (Europa Środkowa)
update by Suchy
*Jaszczur |
| |
|
|
|
|
|