• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z polskimi znakami przy wyciąganiu danych z MySQL - bez UTF-8

0 głosów
2,729 wizyt
pytanie zadane 7 sierpnia 2017 w SQL, bazy danych przez swagimir Nowicjusz (190 p.)
edycja 7 sierpnia 2017 przez swagimir

Cześć,

mam problem z wyciąganiem danych z MySQL'a (celem strony jest wyświetlenie danych w formacie JSON). Kodowanie znaków w MySQL mam utf8_unicode_ci wszędzie (baza, tabele i kolumny), kodowanie pliku .php mam też utf-8 i nie chce działać. Dodawanie do bazy mi działa odkąd zaraz po połączeniu wykonuje się zapytanie:

$db->query("SET NAMES 'utf8'");

Wcześniej też nie chciało działać.

 

Teraz mam problem z wyciąganiem danych bo nic nie pomaga. Ogólnie pliki edytuje w Sublime 2 ale specjalnie pobrałem Notepada++ żeby sprawdzić kodowanie pliku i jest ustawione UTF-8 bez BOM.

 

Pierwszy raz mam taki problem. Wcześniej się z czymś takim nie spotkałem. Dodatkowo dziwne jest to że po ustawieniu meta charset na cp-1250 (dokument cały czas UTF-8 bez BOM) to wyświetla polskie znaki, ale z kolei przy kodowaniu do formatu JSON znowu pojawiają się krzaki zamiast liter. 

 

PS. Do łączenia z bazą używam PDO.

 

Może ktoś się spotkał z czymś podobnym?

 

 

Edit:

Do utworzenia obiektu PDO używam:

$db = new PDO("mysql:host=". $hostname .";dbname=" .$databasename, $username, $password, array(  
	        PDO::ATTR_EMULATE_PREPARES => false,  
	        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
	    	)  
    	);

 

Tutaj też próbowałem zmieniać wszystko na utf8:

ale po restarcie serwera 2 wartości wróciły na latin1, więc może to coś tu jest nie tak.

1 odpowiedź

0 głosów
odpowiedź 7 sierpnia 2017 przez WireNess Stary wyjadacz (11,250 p.)
Kodowanie tabel i bazy danych ustaw na:

utf8_polish_ci

 

Powinno pomóc ;)
komentarz 7 sierpnia 2017 przez swagimir Nowicjusz (190 p.)

Dzięki za odpowiedź. Próbowałem utworzyć nową bazę i wszędzie ustawić utf8_polish_ci i wyciągnąć z niej dane z polskimi znakami i też nie zadziałało frown

komentarz 7 sierpnia 2017 przez WireNess Stary wyjadacz (11,250 p.)
To musi zadziałać! ;D

Pokaż screen bazy danych :D
komentarz 7 sierpnia 2017 przez swagimir Nowicjusz (190 p.)

Tu mam to co jest ustawione obecnie czyli utf8_unicode_ci. Zaraz zrobię jeszcze raz na utf8_polish_ci.

komentarz 7 sierpnia 2017 przez WireNess Stary wyjadacz (11,250 p.)
Skończyły mi się opcje ;/ nie mam pojęcia co tu może być nie tak ;/ U mnie wszystko działa
komentarz 7 sierpnia 2017 przez swagimir Nowicjusz (190 p.)

Utworzyłem nową bazę na utf8_polish_ci i tabela wygląda tak:

 

Tak wygląda skrypt wybierąjacy dane z bazy:

<?php
	header('Content-Type: text/html; charset=utf-8');

	require('databaseConnection.php');

	try{
		$db = new PDO("mysql:host=". $hostname .";dbname=". $databasename, $username, $password, array(  
	        PDO::ATTR_EMULATE_PREPARES => false,  
	        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
	    	)  
    	);

		$query = "select * from tabela;";

		$result = $db->query($query);

		while ($row = $result->fetch(PDO::FETCH_ASSOC)){
			echo "Imie: ".$row["imie"];
		}


	} catch (PDOException $e){
		echo $e->getMessage();
	}

	die();
?>

A wynik w przeglądarce wygląda tak:

komentarz 7 sierpnia 2017 przez manjaro Nałogowiec (37,420 p.)

A w pliku index.php masz dobrze nagłówek?

<!DOCTYPE html>
<html lang="pl">

<head>
    <meta charset="utf-8">

 

komentarz 7 sierpnia 2017 przez swagimir Nowicjusz (190 p.)

W momencie gdy zwracam JSONy nie mogę deklarować heada bo JSONy  są źle zczytywane - musi być czysta treść. Charset trzeba deklarować przez funkcję header w PHP. 

 

Generalnie problem częściowo rozwiązałem. Musiałem dodać 5 linijek w pliku konfiguracyjnym w /etc/mysql/my.cnf. Zmieniły mi się kodowania w MySQL i wyświetla mi polskie znaki, ale teraz z kolei nie pokazuje mi polskich znaków gdy wynik z bazy jest formatowany do JSONów indecision

komentarz 7 sierpnia 2017 przez efiku Szeryf (75,160 p.)
edycja 7 sierpnia 2017 przez efiku

dodaj do polaczenia PDO charset=utf8  ..?

Charset trzeba deklarować przez funkcję header w PHP. 

Nie, nie trzeba.

Ja jakoś od dawna nie miałem problemów z kodowaniem.

Pracuje w PHPStorm, który automatycznie tworzy mi pliki z kodowaniem utf-8. Podczas połączenia za pomocą PDO informuje, że uzywam charset = utf-8.  Po stronie html'a w szablonie ustawiam tylko meta i jakoś działa. 

komentarz 7 sierpnia 2017 przez swagimir Nowicjusz (190 p.)
Już śmiga. Przy funkcji json_encode oprócz JSON_PRETTY_PRINT dodałem JSON_UNESCAPED_UNICODE. Mam nadzieje że problem już jest permanentnie rozwiązany bo straciłem na to kilkanaście dobrych godzin.

Dzięki za wszelką pomoc ;)

Podobne pytania

0 głosów
1 odpowiedź 697 wizyt
0 głosów
0 odpowiedzi 658 wizyt
pytanie zadane 17 października 2017 w SQL, bazy danych przez dominiv2604 Początkujący (350 p.)
0 głosów
0 odpowiedzi 233 wizyt

93,757 zapytań

142,716 odpowiedzi

323,363 komentarzy

63,353 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...