# SQL kodowanie znaków.

## knoot

Witam,

Mam problem z kodowaniem znaków diakrytycznych. Problem pojawia się na linii aplikacji PHPowych oraz samej bazy. Aplikacje zawsze chyba, mają ISO-8859-2, baza UTF-8.

Przykładowo gdy w phpbb wpisujemy ąęłóź nie zapisują się one do bazy. Jednak jeśli w bazie wyedytujemy odpowiedni post wyświetlają się nam... krzaki. Po zmianie w przeglądarce kodowania na UTF-8 - zmieniają się oczywiście na poprawne ogonki, lecz niefortunnie wraz z nimi na krzaki się transponuje cała reszta strony  :Smile: .

Pytanie moje więc - jak problem rozwiązać? Czy da się ustawić dla bazy (MySQL 5.x) kodowanie ISO?

----------

## bartmarian

wg mnie nalezalo by zalozyc baze z odpowiednim kodowaniem,

ja to tego uzywam phpmyadmin'a i/lub zainteresowac sie plikiem

/var/lib/mysql/nazwabazy/db.opt

----------

## ffurbo

 *bartmarian wrote:*   

> wg mnie nalezalo by zalozyc baze z odpowiednim kodowaniem,
> 
> 

 

To często nie wystarczy. Należy jeszcze ustalić kodowanie jakie będzie używane podczas przesyłania danych. Domyślnie jest to utf-8, jak baza jest w latin2 to wychodzą cuda...

Ja ten problem rozwiązuję na poziomie aplikacji php. Po połączeniu z bazą wysyłam zapytanie

```

SET CHARACTER SET 'latin2'

```

Jak ktoś wie jak to ustawić na poziomie konfiguracji serwera to chętnie się dowiem  :Smile: 

----------

## knoot

Wszystko ładnie, tylko, że w phpmyadminie nie ma dla latin2 języka polskiego... jest tylko general i bin, które nie przynoszą efektu. 

Żeby było mało w pliku /usr/share/mysql/charsets/latin2.xml w ogóle nie ma Polskiej mapy znaków... 

(dokładnie tak to wygląda: http://cyberdog.sytes.net/knoot/latin2.txt)

----------

## ffurbo

Szczerze mówiąc te mapki to niezbyt wiele mi mówią. 

Ja opisany przez Ciebie problem miałem z cmsem jPortal. Założyłem dla niego bazę w latin_2_general (wszystkie globalne ustawienia mysqla były w utf8), a następnie dopisałem to w.w.  zapytanie w odpowiednich miejscach i wszystko zaczęło śmigać.

Na pewno nie jest to problem kodowania samej bazy tylko kodowania połączenia.

----------

## knoot

Generalnie chodziło mi o pokazanie, że w tych mapkach nie ma wydzielonej sekcji PL... Ale nieistotne.

Przykładowo - ustawienie dla bazy kodowania "latin2_general_ci" daje nam przy wklepaniu postu w phpBB:

 *Quote:*   

> Could not insert new word matches
> 
> DEBUG MODE
> 
> INSERT INTO phpbb_search_wordmatch (post_id, word_id, title_match) SELECT 2, word_id, 0 FROM phpbb_search_wordlist WHERE word_text IN ('aecl', 'ĄĘĆŁ')
> ...

 

Zaś, jak już wspominałem chyba, ręczne wpisanie w bazę danych ogonków powoduje pojawienie się na stronie krzaczków. Żeby było dziwniej krzaczków tych nie można przestawić zbytnio tak, żeby działały. W UTF-8 po ręcznym przestawieniu strony - same diakrytyki widać. Jednak przy latin2_general_ci nie idzie...

Plik o którym pisał Bartmarian ma zaś postać:

```
default-character-set=latin2

default-collation=latin2_general_ci
```

Więc chyba w porządku...

Jeszcze trzy dni i się przesiądę na postgre, czy coś innego  :Wink: .

----------

## ffurbo

Odnoszę wrażenie że ustawienia z pliku db.opt nie są brane pod uwagę. Tak przynajmniej wyglądało w moim przypadku.

Ja to widzę tak:

1) wpisujesz posta ze strony, to co piszesz ma takie kodowanie jak charset zdefinowany w <meta /> tj iso88592-2 (latin2)

2) mysql traktuje to jako utf8 i konwertuje do latin2

3) to co jest w efekcie zapisywane do bazy to jakieś krzaki do niczego nie podobne

Kiedyś zrzuciłem coś takiego i bawiłem się iconv żeby doprowadzić to do użytku. Konwertując z z latin2 do utf8 dostałem poprawne latin2  :Smile:  Mam nadzieję że nie pokręciłem nic

----------

## knoot

Ale przy ustawieniu kodowania bazy na latin2, phpbb w ogóle nie chce tam nic zapisać (jeśli są diakrytyki)...

Przy UTF-8 tak samo. 

Potrzebowałbym więc, tak jakby, wersji latin2.xml w której byłby - obok czeskiego, węgierskiego etc - język polski.

Zastanawiam się też, czy te problemy nie wiążą się z nie do końca poprawnym ustawieniem lokalizacji...

----------

## 13Homer

A dlaczego nie skorzystać z utf8_encode i utf8decode? Wtedy można pisać w dowolnym języku. Trzeba niestety zadbać o wołanie tych funkcji samemu, ale programiści nie takie rzeczy robią.

Kłopot jest oczywiście w przypadku gotowej aplikacji, bo trzeba ją przerabiać, ale jest to zawsze jakaś alternatywa.

----------

## knoot

13Homer to już z pewnością nie wchodzi w grę w moim przypadku  :Smile: . Przerabianie phpBB i Joomla przy mojej znajomości PHP (niżej niż elementarna) jest niemożliwe...

Jeśli rozwiązanie się nie znajdzie zwyczajnie zrezygnuję z MySQL na rzecz Postgre...

Wolałbym jednak MySQL, bo sporo CMSów obsługuje wyłącznie jego.

----------

## Eeeyeore

@knoot to nie wina mysql przejście na postgres nie rozwiaze gdzies zle ustawiles kodowanie i musisz dojsc do tego gdziespitoliles dla przykladu -> IP Borad domyslnie jedzie na latin-1 Header jest na 8859-2, a jak się importuje sie dumpa na utf-8 (ciut podziergane prawda  :Smile:  )- musisz po prostu rozgryxc system phpbb i kodowania znakow , ale dla phpbb najlepsze sa konwertery na IP Board  :Smile:  - ale to komercyjne - ale warto  :Smile: 

Phpmyadmin nie wszystko umie - korzystaj z mysqladmina jest wielokrotnie szybszy.

Pozdrawiam

----------

## knoot

Pytanie do korzystających z phpmyadmina - czy w kodowaniu latin2 macie do wyboru latin2_polish_ci?

Lokalizacja jest już, jak sądzę, ustawiona poprawnie.

W /etc/mysql/my.cnf wszystko przestawione na latin2.

 *Quote:*   

> [mysql]
> 
> character-sets-dir=/usr/share/mysql/charsets
> 
> #default-character-set=utf8
> ...

 

Locale ładne:

 *Quote:*   

> LANG=pl_PL
> 
> LC_CTYPE="pl_PL"
> 
> LC_NUMERIC="pl_PL"
> ...

 

W make linguas na "en pl".

Jednak, przy ustawieniu w phpmyadminie latin2_general_ci... błąd w phpbb. Nie chce tego łyknąć.

Po skorygowanej lokalizacji rekompilowałem już mysql'a, env-update && source /etc/profile chodziły dziesiątki razy...

I nic. Jest jak było.

----------

## dziadu

A ten temat widział?

https://forums.gentoo.org/viewtopic-p-3943020-highlight-.html#3943020

Chyba o to samo chodzi a nie chce mi się dwa razy pisać :-]

----------

## knoot

Dziadu: Przyznam, że się zupełnie pogubiłem w tych trzech stronach dociekań kilku osób  :Confused: .

Natomiast znalazłem jedną rzecz, która tyleż przybliża do rozwiązania problemu, co zupełnie mnie dziwi.

Zmienne systemowe serwera MySQL w/g phpmyadmin:

 *Quote:*   

> character set client	utf8
> 
> (Wartość globalna)		latin2
> 
> character set connection		latin2
> ...

 

Jak widać w trzech miejscach tkwi nadal uparcie UTF-8. 

Sęk w tym, że absolutnie nie mam już pojęcia jak to zmienić...

----------

## ffurbo

Nie instalowałem tego i nie testowałem, więc nie wiem czy to zadziała, ale ja zrobił bym tak:

plik db/mysql.php funkcja sql_db() w linii 20 zaraz po  

```
$dbselect = @mysql_select_db($this->dbname);
```

dałbym

```
mysql_query("SET CHARACTER SET 'latin2' ");
```

Jak to nie zadziała to ja się poddaję.

----------

## dziadu

 *knoot wrote:*   

> Dziadu: Przyznam, że się zupełnie pogubiłem w tych trzech stronach dociekań kilku osób .

 

To pozwol sobie zacytować jeden post z forum przema (z adresu ktory byl w podanym przeze mnie temacie):

 *Quote:*   

> To spróbuj 
> 
> config.php ma mieć wpis Kod:
> 
> $dbms = 'mysql4';
> ...

 

U mnie działało.

----------

## ffurbo

Całkiem podobne do mojego  :Smile: 

OIMW "SET NAMES" potrzebne jest jeśli nazwy tabel lub pól zawierają nasze ogonki.

----------

## mpapis

ja akorat stawiam na utf8, dlatego umnie (my.cnf) ustawilem takie zmienne, prawdopodobnie wiekszosc zadziala po podmianie utf8 na latin2

```
[client]

default-character-set=utf8

[mysqld]

init-connect='SET NAMES utf8'

character-set-server=utf8

collation-server=utf8_polish_ci

default-collation=utf8_polish_ci

character-set-client-handshake=0

character-sets-dir=/usr/share/mysql/charsets
```

----------

## msch

ktos sprawdzil, czy to dziala?

----------

## mrowkaz

 *msch wrote:*   

> ktos sprawdzil, czy to dziala?

 

rozwiązanie problemu  :Smile: 

w pliku /etc/php/apache2-php5/php.ini

usuwamy  znak średnika  i przypisujemy zmiennym wartosci na latin2

; MySQL extensions default connection charset settings

mysql.connect_charset = latin2

mysqli.connect_charset = latin2

pdo_mysql.connect_charset = latin2

oraz w pliku /etc/mysql/my.cnf poprostu zamieniamy na latin2 i już !!!

[mysql]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

[mysqladmin]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

[mysqlcheck]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

[mysqldump]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

[mysqlimport]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

[mysqlshow]

character-sets-dir=/usr/share/mysql/charsets

default-character-set=latin2

----------

