Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql polskie kodowanie znaków
Forum PHP.pl > Forum > Bazy danych > MySQL
rysic
Potrzebuję pomocy z kodowaniem znaków w mysql-u. Nie zajmuję się zawodowo PHP, więc całkiem możliwe, że robię coś nie tak już u podstaw. Próbowałem już wielu możliwości, ale żadna nie pomaga. sciana.gif

Standardowo mój kod wygląda mniej więcej tak:

  1.  
  2. try
  3. {
  4. $pdo = new PDO('mysql:host=localhost;dbname=test','root','Kokomoko6677', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
  5.  
  6. $pdo ->query('SET CHARACTER SET utf8;');
  7. $pdo -> query('SET character_set_client = utf8;');
  8. $pdo -> query('SET character_set_results = utf8;');
  9. $pdo -> query('SET character_set_connection = utf8;');
  10. $pdo -> query('SET character_set_database = utf8;');
  11. $pdo -> query('SET character_set_server = utf8;');
  12. $pdo -> query ('SET NAMES utf8');
  13. $pdo -> query ('SET CHARACTER_SET utf8_unicode_ci');
  14.  
  15.  
  16. //$pdo -> query('SELECT id, content FROM articles;');
  17. //echo "połączenie nawiązane";
  18. }
  19. catch(PDOException $e)
  20. {
  21. echo 'Połączenie nie mogło zostać nazwiązane<br/>'.$e->getMessage();
  22. }
  23.  
  24. $ilosc = $pdo -> exec('INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')');
  25.  


Pewnie zbyt dużo tam tych SET, ale zacząłem już dokładać wszystko co mogło by coś zmienić... wstydnis.gif

Potem uznałem, że może biblioteka PDO coś nie tegest jest, więc zrobiłem to tak:

  1. $sql_conn = mysql_connect('localhost' , 'root' , 'Kokomoko6677');
  2. mysql_select_db ("test");
  3. mysql_query('set names latin2 collate utf8_unicode_ci');
  4. mysql_query('set character set utf8');
  5.  
  6. $zapytanko='INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  7. mysql_query($zapytanko );


Na bazie wykonywałem:

  1. ALTER DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
  2. ALTER TABLE `markety` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;


oraz sprawdzałem kodowanie przez:

  1. SHOW CREATE DATABASE
  2. mysql> SHOW CREATE DATABASE test
  3. -> ;
  4. +----------+--------------------------------------------------------------------------------------+
  5. | DATABASE | CREATE DATABASE |
  6. +----------+--------------------------------------------------------------------------------------+
  7. | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_polish_ci */ |
  8. +----------+--------------------------------------------------------------------------------------+
  9. 1 row IN SET (0.00 sec)
  10.  
  11.  
  12. SHOW CREATE TABLE markety;
  13. ...
  14. ENGINE=MyISAM AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci


phpMyAdmin pokazuje to samo.

Na stronie w nagłóku mam:

  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />


Baza, Apache i PHP postawione są na Debianie. Jak zrobię zapytanie z palca do bazy, to polskie znaki są widoczne w tabeli.

Nie mam już kompletnie pomysłu co może być nie tak...

Proszę o pomoc. Z góry dziękuję!
Pilsener
Problem jest stary jak świat a rozwiązanie standardowe: należy sprawdzić, w jakim kodowaniu "krzaki" lecą do bazy, w jakim kodowaniu są w bazie oraz w jakim są pobierane z bazy i wyświetlane na stronie. Służy to tego:
http://pl2.php.net/manual/en/function.mb-detect-encoding.php
rysic
Ta funkcja zwraca: ASCII, czyli coś nie tak jest jeszcze przed wysłaniem do bazy... Teraz kwestia przerobienia tego na UTF-8. Postaram się nad tym popracować i dam znać, czy mi się udało. Dzięki!

EDIT:
Chyba jednak jakieś bzdury piszę...

  1. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  2. //$zapytanko = utf8_encode ( $zapytanko );
  3. echo "Kodowanie: ";
  4. echo mb_detect_encoding($zapyt);
  5. $ilosc = $pdo -> exec($zapytanko);


Jak powinienm to przekonwertować?

"w jakim kodowaniu są w bazie oraz w jakim są pobierane z bazy i wyświetlane na stronie"
W bazie są już krzaki, więc chyba nie ma sensu przechodzić do sprawdzania jak są wyświetlane.



Po kilku próbach zrobiłem jeszcze tak:

  1. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  2. $zapytanko = utf8_encode ( $zapytanko );
  3. echo "Kodowanie z POST: ",mb_detect_encoding($_POST['nazwa']);
  4. echo "Kodowanie zapytania: ".mb_detect_encoding($zapyt);


I wynik mam taki:

Kodowanie z POST: UTF-8
Kodowanie zapytania: ASCII

To chyba wszystko wyjaśnia. Dane przychodzą poprawne, ale już tworzone zapytanie nie jest poprawne. Dobrze to rozumiem?
Jeśli tak, to w jaki sposób zmusić zmienną $zapytanko do poprawnego kodowania? Funkcja utf8_encode jakoś nie ma ochoty zadziałać, jak widać.





EDIT


Przepraszam, że tak wam marudzę, ale próbowałem jeszcze wielu porad, które znalazłem i nadal to nie działa. sadsmiley02.gif Żeby wszystko było jasne, to przedstawię na jakim jestem aktualnie etapie:

Na bazie próbowałem ustawiać różnego kodowania, aktualnie zostało: utf8_unicode_ci

Dla pewności zastosowałem już wszystko co się dało do kodowania ba bazie:
  1. $pdo ->query('SET CHARACTER SET utf8;');
  2. $pdo -> query('SET character_set_client = utf8;');
  3. $pdo -> query('SET character_set_results = utf8;');
  4. $pdo -> query('SET character_set_connection = utf8;');
  5. $pdo -> query('SET character_set_database = utf8;');
  6. $pdo -> query('SET character_set_server = utf8;');
  7. $pdo -> query ('SET CHARACTER_SET utf8_unicode_ci');
  8. $pdo -> query ('SET NAMES utf8');


Strona powinna być kodowana poprawnie:
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  2. </head>


Po pobraniu danych sprawdzam jak są kodowane:
  1. $nazwa = $_POST['nazwa'];
  2. ...
  3. $zapytanko = 'INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES(\''.$nazwa.'\',\''.$numer.'\',\''.$ip.'\',\''.$lokalizacja.'\',\''.$adres.'\','.$vlan.',\''.$telefon.'\',\''.$numertp.'\')';
  4. echo "zapytanko: ".$zapytanko;
  5. echo "<br>Kodowanie zapytania: ".mb_detect_encoding($zapytanko);
  6. echo "nazwa: ".$nazwa;
  7. echo "<br>PO: ".mb_detect_encoding($nazwa);
  8. echo "nazwa z POST".$_POST['nazwa'];
  9. echo "<br>Kodowanie z POST: ".mb_detect_encoding($_POST['nazwa']);


i potem wysłanie do bazy:
  1. $ilosc = $pdo -> exec($zapytanko);


Po wykonaniu powyższego wyświetla mi się

zapytanko: INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES('aąeęążźś','9960','10.51.99.0','','',0,'','')zapytanko: INSERT INTO `markety` (`nazwa`, `numer`, `ip`, `lokalizacja`, `adres`, `vlan`, `telefon`, `numertp`) VALUES('aąeęążźś','9960','10.51.99.0','','',0,'','')
Kodowanie zapytania: UTF-8
nazw: aaąeęążźś
Po: UTF-8
nazwa z POSTaąeęążźś
Kodowanie z POST: UTF-8

Zgodnie z tym, co pisałeś Pilsener, przetestowałem kodowanie w każdym miejscu po drodza i jak widać, wszystko jest OK - UTF-8, polskie znaki. Niestety w bazie są tylko krzaki.... nazwa => a?e?questionmark.gifquestionmark.gif



Bardzo proszę o pomoc, bo nie potrafię sobie z tym poradzić sadsmiley02.gif

EDIT

Ruszyło się do przodu!! smile.gif
Po wielu walkach (z serwerem na Debianie włącznie). Zaczęło częściowo działać!

Ostatecznie wygląda to tak, że dane, które wpadają do bazy są wcześniej kodowane przez utf8_encode a po wyjęciu z bazy dekodowane przez utf8_decode. Działa to dla części znaków, jak óźż, ale krzaki robią się dla ąę. Ktoś wie co może być nie tak?










DOBRA! Widzę, że na tym forum nie ma co liczyć na pomoc...
Dzięki!
Pilsener
Cytat
utf8_encode — Koduje ciąg znaków w ISO-8859-1 do UTF-8
- nie wydaje mi się, żeby ISO-8859-1 było odpowiednie dla polskich znaków, używa się ISO środkowoeuropejskiego, utf8 albo windows.
rysic
Dzięki Pilsner! Czy powinienem użyć tej funkcji?

  1. $nazwa = iconv("ISO-8859-2", "UTF-8", $nazwa);


Niestety ona wrzuca mi do bazy same znaki zapytania...
Pilsener
A po co chcesz konwertować skoro wszędzie masz utf-8? Po to ustawiamy takie same kodowanie w bazie, na stronie i przy połączeniu by nie konwertować niczego winksmiley.jpg

Jeśli na stronie masz inne kodowanie a do bazy chcesz wysłać inne, to można zrobić też tak:
algorytmy.pl/doc/xhtml/index.php?id=2002
rysic
Twoja podpowiedź

  1. accept-charset="ISO-8859-2"


+ konwertowanie tego co otrzymuję ze strony do bazy

  1. iconv("Windows-1252", "UTF-8", ...)


a potem konwertowanie z bazy na wyświetlenie

  1. iconv("UTF-8", "ISO-8859-1", ...)


oraz ustawienie na stronie kodowania

  1. header('Content-Type: text/html; charset=ISO-8859-2');


oraz ustawienie kodowania w bazie na UTF8 wreszcie pomogło!!!

To jest dla mnie trochę dziwne, bo z tego co tu widać, dostaję dane w Windows-1254 (mimo, że ustawiałem kodowanie na stronie na UTF8/USO-8859-2/... oraz mam ustawione akceptowane dane z formularza na ISO-8859-2) a jak chcę je tak wyświetlić, to mu nie pasuje... Nie chcę już tego drążyć więcej... ważne, że działa już.

Dzięki!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.