Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kodowanie bazy i polskich znaków w UNICODE
Forum PHP.pl > Forum > Bazy danych > MySQL
maknus
Witam

Czy jest jakaś funkcja/ustawienie które pozwoli mi kodować bazę danych tak aby polskie znaczki zapisywane były w postaci np: "&#260 ;" zamiast Ą . Wiem że mogę zrobić to z poziomu php wyszukując polskie znaki w stringu i zamieniać na ich numeryczną postać ale jeśli tekst byłby długi to taka funkcja trochę czasu by trwała. Czy jest możliwość zrobienia tego z poziomy bazy danych??

Z góry dziękuję z podpowiedź.
darko
Przede wszystkim pamiętaj o tym, że kodowanie musi być wszędzie zgodne (utf8), to znaczy takie samo w skrypcie php, takie samo w bazie i takie samo na stronie. Odnośnie kodowania w bazie to poszczególne kolumny tekstowe (najlepiej całe tabele) powinny mieć ustawione kodowanie z rodziny utf8_XXX_ci/utf8_XXX_cs, gdzie XXX może być jednym z ciągów: general, polish, unicode. Czyli np. utf8_general_ci. Jeśli chodzi o funkcje w php pomagające zachować jednolite kodowanie:

  1. utf8_encode(string $data);
  2. iconv_set_encoding("internal_encoding", "UTF-8");
  3. iconv_set_encoding("output_encoding", "UTF-8");

Pamiętaj też, że samo kodowanie skryptu php powinno być utf8 bez znacznika bom (byte of mark), można,a nawet trzeba to ustawić (jeśli nie jest ustawione) w edytorze, z którego korzystasz, a jeśli nie, to zmień edytor.
// edit
w mysql są funkcje
  1. character SET utf8
  2. SET names utf8
maknus
Dzięki za podpowiedź ale z kodowaniem znaków na stronie nie mam problemów. Chodzi o to, iż mam dodatkową aplikację która pobiera dane z bazy mysql i ona potrzebuje aby polskie znaki były kodowane w sposób "&#260 ;" zamiast Ą itd.. bo inaczej tego nie obsłuży. Chciałbym to zrobić na poziomie bazy danych, aby polskie znaki zapisywane były w takim formacie ("&#260 ;" zamiast Ą). Myślałem nad zrobieniem procedury, która by robiła podmianę i triggera, który by tą procedurę wywoływał po insercie. Ale nie wiem czy to najlepszy pomysł smile.gif
darko
Lepiej to zrobić już w samej aplikacji w php, gdyż dane poprawnie zakodowane w bazie mogą się przydać w innym celu:
  1. $text = 'ąĄćĆęĘłŁńŃóÓśŚźŹżŻ';
  2. array('ą', 'Ą', 'ć', 'Ć', 'ę', 'Ę', 'ł', 'Ł', 'ń', 'Ń', 'ó', 'Ó', 'ś', 'Ś', 'ź', 'Ź', 'ż', 'Ż'),
  3. array('ą','Ą','ć','Ć','ę','Ę','ł','Ł','ń','Ń', 'ó','Ó','ś','Ś','ź','Ź','ż','Ż'),
  4. $text);

Powinno się dać jeszcze prościej to zrobić za pomocą jakiejś funkcji, której nazwy niestety nie pamiętam w tym momencie.
Sorry ale chyba nie da się tutaj tego wkleić, bo niepoprawnie wyświetla, w każdym razie ta druga tablica składa się z elementów zaczynających się od ampersandu i hasha, a kończy średnikiem, a pomiędzy są następujące wartości:
261 260 263 262 281 280 322 321 324 323 243 211 347 346 378 377 380 379
maknus
Niestety potrzebuję tego na poziomie bazy danych, aby już dane były w tym formacie w niej zapisane, przepuszczać każdego stringa przed insertem i update przez funkcje php zmieniającą to strasznie dużo roboty dlatego szukam prostszego rozwiązania najlepiej na poziomie bazy danych.
darko
Cytat(maknus @ 31.01.2011, 11:23:31 ) *
Niestety potrzebuję tego na poziomie bazy danych, aby już dane były w tym formacie w niej zapisane, przepuszczać każdego stringa przed insertem i update przez funkcje php zmieniającą to strasznie dużo roboty dlatego szukam prostszego rozwiązania najlepiej na poziomie bazy danych.

To będzie tak samo, jak w php tylko za pomocą mysql'owej funkcji replace
maknus
To teraz z innej strony smile.gif

Napisałem sobie taką małą procedurę do zmiany polskich liter, w skrócie wygląda ona tak:

  1. DROP PROCEDURE IF EXISTS proc2;
  2. delimiter //
  3. CREATE PROCEDURE proc2 (IN id_p INT)
  4. BEGIN
  5. UPDATE tabela1 SET tekst = REPLACE(tekst,'ą','a') WHERE id = id_p;
  6. END//
  7. delimiter ;


Tylko że nie chce dodać mi przyjąć tego 'ą'. Jeśli dam REPLACE(tekst,'b','a') nie ma problemu działa ale jak daje REPLACE(tekst,'ą','a') to mi się wywala.

Z góry dzięki za podpowiedź
darko
To jest chyba ten bug mysql ale nie jestem pewien, ogólnie u mnie raczej słabo z procedurami/funkcjami. Sprawdziłem za to samo replace w zapytaniu i u mnie działa.
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.