Ansluta från utf8-system till en MySQL-server som kör latin1

Nu när det ändå är 2011 kan man tycka att man skulle kunna få slippa problem med teckenuppsättningar. Så är det tyvärr inte alltid.

Om du kör en modern Ubuntu har du förmodligen utf8 som locale i systemet:

root@vps:~# cat /etc/default/locale 
LANG="en_US.utf8"

Om du ansluter till ett system som kör latin1, med en MySQL-databas som kör latin1 märker du genast att det är problem:

mysql> SELECT * FROM table WHERE id=1G
*************************** 1. row ***************************
            id: 1
       address: Enh?rningsv?gen 1
postal_address: 28143 H?ssleholm
1 row in set (0.00 sec)

Hur är det då inställt?

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+-----------------------------------------------------------------------+
| Variable_name            | Value                                                                 |
+--------------------------+-----------------------------------------------------------------------+
| character_set_client     | latin1                                                                |
| character_set_connection | latin1                                                                |
| character_set_database   | latin1                                                                |
| character_set_filesystem | binary                                                                |
| character_set_results    | latin1                                                                |
| character_set_server     | latin1                                                                |
| character_set_system     | utf8                                                                  |
| character_sets_dir       | /usr/local/mysql-5.0.51a-linux-i686-icc-glibc23/share/mysql/charsets/ |
+--------------------------+-----------------------------------------------------------------------+
8 rows in set (0.00 sec)

Vi ändrar character_set_client, character_set_connection och character_set_results till utf8:

mysql> SET character_set_client=utf8; SET character_set_connection=utf8; SET character_set_results;
Query OK, 0 rows affected (0.00 sec)

Genast blir det bättre:

mysql> SELECT * FROM table WHERE id=1G
*************************** 1. row ***************************
            id: 1
       address: Enhörningsvägen 1
postal_address: 28143 Hässleholm
1 row in set (0.00 sec)