pluton 20.04.2009 14:41

Tips & tricksMySQL + UTF8

Всем привет!

В этом посте хочу описать, как установить кодировку UTF8 в MySQL.



После установки кодировка была latin1. Чтобы посмотреть это, запускаем клиент:

1
2
3
4
5
6
7
8
9
$ mysql

mysql> \s

...

Server characterset: latin1

...



Естественно, нам это не подходит.

После поисков в интернете и мане оказалось, что нужно подправить /etc/mysql/my.conf так:

1. в секцию дописать:

 1
2
3
4
5
6
7
8
9
10
11
 
default-character-set=utf8

character-set-server=utf8

character-set-client=utf8

init-connect='SET NAMES utf8'

skip-character-set-client-handshake




2. в секции и дописать:

1
default-character-set=utf8





Перезагружаем сервер:

1
2
3
4
5
6
7
$ sudo /etc/init.d/mysql restart

* Stopping MySQL database server mysqld < OK >

* Starting MySQL database server mysqld < OK >

* Checking for corrupt, not cleanly closed and upgrade needing tables.





Проверим, применились ли настройки:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
$ mysql

mysql> \s

...

Server characterset: utf8

Db characterset: utf8

Client characterset: utf8

Conn. characterset: utf8

...



mysql> SHOW VARIABLES LIKE 'char%';

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/share/mysql/charsets/ |





По выводу видно, что переменные установлены правильно. Для проверки создадим БД и таблицу, запишем и выведем данные:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
mysql&gt; CREATE DATABASE test;

mysql&gt; SHOW CREATE DATABASE test;

| test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |

mysql&gt; USE test;

Database changed

mysql&gt; CREATE TABLE test(title VARCHAR(1000));

mysql&gt; SHOW CREATE TABLE test;

| test | CREATE TABLE `test` (

`title` varchar(1000) default NULL

) ENGINE=MyISAM DEFAULT CHARSET=utf8 |

mysql&gt; INSERT INTO test VALUES(&#39;Русско-японская война (яп. ???? Нити-Ро сэнсо:, кит. трад. ????, упрощ. ????, пиньинь R??zh?nzh?ng, палл. Жиэчжаньчжэн; 8 февраля 1904 — 27 июля 1905) — война между Россией и Японией за контроль над Маньчжурией и Кореей.');

Query OK, 1 row affected (0.00 sec)

mysql&gt; SELECT * FROM test;

Русско-японская война (яп. ???? Нити-Ро сэнсо:, кит. трад. ????, упрощ. ????, пиньинь R??zh?nzh?ng, палл. Жиэчжаньчжэн; 8 февраля 1904 27 июля 1905) война между Россией и Японией за контроль над Маньчжурией и Кореей.



Ура. Вывод работает, и везде стоит кодировка utf8. Ну, и напоследок проверим связь с php:

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
&lt;?php

header(&#39;Content-Type: text/html; Charset=utf-8');

$conn = mysql_connect(&#39;localhost', 'j', '') or die('can\'t connect to db');

// mysql_query('SET NAMES utf8;');

mysql_select_db(&#39;test', $conn) or die('can\'t select db');

$res = mysql_query(&#39;SELECT * FROM test;');

if (!$res)

die(&#39;invalid query: ' . mysql_error());

$row = mysql_fetch_array($res, MYSQL_NUM);

print $row<0>;

mysql_close($conn) or die(&#39;can\'t close connection');

?&gt;



И тут тоже работает. Строку mysql_query('SET NAMES utf8;'); необходимо раскоментить, если в конфиге не прописана строка init-connect.

Вот и всё. Кстати, PostgreSQL удобнее -- в нём по умолчанию стоит utf8.



ps. Пишу этот пост и для себя, чтобы потом долго не вспоминать, что куда писать.


Тэги: mysql utf8
+ 5 -
Похожие Поделиться

xcr 20.04.2009 15:03 #
Спасибо, полезно
Когда работал веб-девелопером, часто сталкивался с проблемами с кодировкой mysql. Как-то раз хотел найти решение, но я тогда еще слабо владел гуглингом )
zwey 20.04.2009 15:32 #
Спасибо за хороший мануал. Какраз недавно с такой проблемой сталкивался...