# MySQL i kodowanie ISO-8859-2

## zertaul

Skompilowałem Apache z obsługą PHP i MySQL-a, ustawiłem w pliku konfiguracyjnym my.cnf kodowanie na latin2, locale na pl_PL.iso8859-2, ale nie mogę zmusić MySQL-a do kodowania znaków w ISO8859-2.

Po uruchomieniu phpMyAdmin-a mam do wyboru wszystkie języki, ale tylko z kodowaniem UTF-8.

System kodowania znaków dla MySQL jest ustawiony na UTF-8 Unicode (utf8)

moje locale:

```
localhost ~ # locale

LANG=pl_PL.iso8859-2

LC_CTYPE="pl_PL.iso8859-2"

LC_NUMERIC="pl_PL.iso8859-2"

LC_TIME="pl_PL.iso8859-2"

LC_COLLATE="pl_PL.iso8859-2"

LC_MONETARY="pl_PL.iso8859-2"

LC_MESSAGES="pl_PL.iso8859-2"

LC_PAPER="pl_PL.iso8859-2"

LC_NAME="pl_PL.iso8859-2"

LC_ADDRESS="pl_PL.iso8859-2"

LC_TELEPHONE="pl_PL.iso8859-2"

LC_MEASUREMENT="pl_PL.iso8859-2"

LC_IDENTIFICATION="pl_PL.iso8859-2"

LC_ALL=pl_PL.iso8859-2

localhost ~ # locale -a

C

en_US

pl_PL

pl_PL.iso88592

POSIX

```

Wartości systemowe w/g phpMyAdmin-a

```

                     wartość sesji      wartość globalna

character set client       utf8          latin2    

character set connection    latin2          latin2    

character set database       latin2          latin2    

character set results       utf8          latin2    

character set server       latin2          latin2    

character set system       utf8          utf8    

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

collation connection    latin2_general_ci       latin2_general_ci    

collation database       latin2_general_ci       latin2_general_ci    

collation server       latin2_general_ci       latin2_general_ci

```

Jak zmusić MySQL-a do korzystania z ISO8859-2? Czy jest to wina MySQL-a, czy też systemu?

----------

## martin.k

W /etc/mysql/my.cnf

```

[mysql]

default-character-set=latin2

```

Dodatkowo w php.ini mam:

```

default_charset="iso-8859-2"
```

A w httpd.conf:

```

AddDefaultCharset ISO-8859-2
```

A co do mysql i UTF-8 to od wersji 4 coś tam - teraz nie pomnę - nazwy tabel domyślnie są kodowane w UTF-8.

Osobiście skompilowałem sobie mysql-a (4.0.26) z flagą "-utf8". Nie potrzebuję BAZY DANYCH tylko bazę danych do www - więc uft-8 i inne wodotryski nie są mi potrzebne  :Smile: 

----------

## zertaul

Mój plik /etc/mysql/my.cnf:

```

[mysql]

character-sets-dir=latin2

default-character-set=latin2

[mysqladmin]

character-sets-dir=latin2

default-character-set=latin2

[mysqlcheck]

character-sets-dir=latin2

default-character-set=latin2

[mysqldump]

character-sets-dir=latin2

default-character-set=latin2

[mysqlimport]

character-sets-dir=latin2

default-character-set=latin2

[mysqlshow]

character-sets-dir=latin2

default-character-set=latin2

[myisamchk]

character-sets-dir=latin2

[myisampack]

character-sets-dir=latin2

[mysqld_safe]

err-log                                         = /var/log/mysql/mysql.err

# add a section [mysqld-4.1] or [mysqld-5.0] for specific configurations.

[mysqld]

character-set-server            = latin2

default-character-set           = latin2

user                                            = mysql

port                                            = 3306

socket                                          = /var/run/mysqld/mysqld.sock

pid-file                                        = /var/run/mysqld/mysqld.pid

log-error                                       = /var/log/mysql/mysqld.err

basedir                                         = /usr

datadir                                         = /var/lib/mysql

skip-locking

#skip-innodb

key_buffer                                      = 16M

max_allowed_packet                      = 1M

table_cache                             = 64

sort_buffer_size                        = 512K

net_buffer_length                       = 8K

read_buffer_size                        = 256K

read_rnd_buffer_size            = 512K

myisam_sort_buffer_size         = 8M

language                                        = /usr/share/mysql/english

#security:

#using "localhost" in connects use sockets by default

#skip-networking

bind-address                            = 127.0.0.1

log-bin

server-id                                       = 1

# Point the following paths to different dedicated disks

tmpdir                                          = /tmp/

#log-update                             = /path-to-dedicated-directory/hostname

# you need debug use flag enabled to use this ones.

# if needed uncomment them, start the server and issue

# #tail -f /tmp/mysqld.sql /tmp/mysqld.trace

# this will show you *exactly* what's appening in your server ;)

#log                                            = /tmp/mysqld.sql

#gdb

#debug                                          = d:t:i:o,/tmp/mysqld.trace

#one-thread

# Uncomment the following if you are using BDB tables

#bdb_cache_size                         = 4M

#bdb_max_lock                           = 10000

innodb_buffer_pool_size         = 16M

innodb_additional_mem_pool_size = 2M

innodb_data_file_path           = ibdata1:10M:autoextend

innodb_log_file_size            = 5M

innodb_log_buffer_size          = 8M

set-variable                            = innodb_log_files_in_group=2

innodb_flush_log_at_trx_commit  = 1

innodb_lock_wait_timeout        = 50

[mysqldump]

quick

max_allowed_packet                      = 16M

[mysql]

# Remove the next comment character if you are not familiar with SQL

#safe-updates

[isamchk]

key_buffer                                      = 20M

sort_buffer_size                        = 20M

read_buffer                             = 2M

write_buffer                            = 2M

[myisamchk]

key_buffer                                      = 20M

sort_buffer_size                        = 20M

read_buffer                             = 2M

write_buffer                            = 2M

[mysqlhotcopy]

interactive-timeout

```

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

```

localhost ~ # cat /etc/php/apache2-php5/php.ini  |grep default_charset

default_charset = "iso-8859-2"

```

/etc/apache2/httpd.conf

```

localhost ~ # cat /etc/apache2/httpd.conf |grep AddDefaultCharset

AddDefaultCharset ISO-8859-2

```

MySQL-a skompilowałem z opcją -utf8, a to bydlę nadal domyślne kodowanie ustawia na UTF-8. Ja także potrzebuję bazy do WWW, a nie jakiegoś wodotrysku utrudniającego życie, co się zowie UTF-8.

----------

## czestmir

jeśli to mysql 4.1.x lub 5.x to po połączeniu z bazą trzeba mu zapodać

```
mysql_query("SET NAMES latin2")
```

----------

## zertaul

 *czestmir wrote:*   

> jeśli to mysql 4.1.x lub 5.x to po połączeniu z bazą trzeba mu zapodać
> 
> ```
> mysql_query("SET NAMES latin2")
> ```
> ...

 

To jednak nie rozwiązuje mojego problemu, bo phpmyadmin mówi mi:

```
System kodowania znaków dla MySQL: UTF-8 Unicode (utf8)
```

a w liście języków są tylko takie, które mają kodowanie UTF-8

----------

## martin.k

No to jeszcze taki eksperyment:

mysql.cnf

```
language        = /usr/share/mysql/polish

default-character-set = latin2

default-collation = latin2_general_ci
```

skrypt php:

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

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

I jeszcze rada na wszelki wypadek, zrób pełny dump bazy danych,

konwersje charsetu nie zawsze są odwracalne, więc jeśli coś zrobisz

nie tak, możesz mieć problem. Tutaj więcej:

http://dev.mysql.com/doc/refman/4.1/en/charset-conversion.html

I może jeszcze reemerguj phpmyadmina  :Smile: 

----------

## zertaul

Niestety i to nie pomogło. Ciekawe, że w/g phpmyadmin'a serwer MySQL jest odpalany domyślnie z kodowaniem ISO-8859-2, natomiast system pracuje w UTF-8:

```

character set server    latin2

character set system    utf8

```

Więc może któraś ze zmiennych systemowych trzeba ustawić na ISO-8859-2, pytanie tylko którą?

----------

