Tips & tricks — MySQL + UTF8
Всем привет!
В этом посте хочу описать, как установить кодировку UTF8 в MySQL.
После установки кодировка была latin1. Чтобы посмотреть это, запускаем клиент:
Естественно, нам это не подходит.
После поисков в интернете и мане оказалось, что нужно подправить /etc/mysql/my.conf так:
1. в секцию [mysqld] дописать:
2. в секции [mysqldump] и [mysql] дописать:
Перезагружаем сервер:
Проверим, применились ли настройки:
По выводу видно, что переменные установлены правильно. Для проверки создадим БД и таблицу, запишем и выведем данные:
Ура. Вывод работает, и везде стоит кодировка utf8. Ну, и напоследок проверим связь с php:
И тут тоже работает. Строку mysql_query('SET NAMES utf8;'); необходимо раскоментить, если в конфиге не прописана строка init-connect.
Вот и всё. Кстати, PostgreSQL удобнее -- в нём по умолчанию стоит utf8.
ps. Пишу этот пост и для себя, чтобы потом долго не вспоминать, что куда писать.
В этом посте хочу описать, как установить кодировку UTF8 в MySQL.
После установки кодировка была latin1. Чтобы посмотреть это, запускаем клиент:
1 2 3 4 5 6 |
$ mysql mysql> \s ... Server characterset: latin1 ... |
Естественно, нам это не подходит.
После поисков в интернете и мане оказалось, что нужно подправить /etc/mysql/my.conf так:
1. в секцию [mysqld] дописать:
1 2 3 4 5 6 7 |
default-character-set=utf8 character-set-server=utf8 character-set-client=utf8 init-connect='SET NAMES utf8' skip-character-set-client-handshake |
2. в секции [mysqldump] и [mysql] дописать:
default-character-set=utf8
Перезагружаем сервер:
1 2 3 4 |
$ 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 |
$ 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 |
mysql> CREATE DATABASE test; mysql> SHOW CREATE DATABASE test; | test | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ | mysql> USE test; Database changed mysql> CREATE TABLE test(title VARCHAR(1000)); mysql> SHOW CREATE TABLE test; | test | CREATE TABLE `test` ( `title` varchar(1000) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 | mysql> INSERT INTO test VALUES('Русско-японская война (яп. 日露戦争 Нити-Ро сэнсо:, кит. трад. 日俄戰爭, упрощ. 日俄战争, пиньинь Rìézhànzhēng, палл. Жиэчжаньчжэн; 8 февраля 1904 — 27 июля 1905) — война между Россией и Японией за контроль над Маньчжурией и Кореей.'); Query OK, 1 row affected (0.00 sec) mysql> 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 |
<?php header('Content-Type: text/html; Charset=utf-8'); $conn = mysql_connect('localhost', 'j', '') or die('can\'t connect to db'); // mysql_query('SET NAMES utf8;'); mysql_select_db('test', $conn) or die('can\'t select db'); $res = mysql_query('SELECT * FROM test;'); if (!$res) die('invalid query: ' . mysql_error()); $row = mysql_fetch_array($res, MYSQL_NUM); print $row[0]; mysql_close($conn) or die('can\'t close connection'); ?> |
И тут тоже работает. Строку mysql_query('SET NAMES utf8;'); необходимо раскоментить, если в конфиге не прописана строка init-connect.
Вот и всё. Кстати, PostgreSQL удобнее -- в нём по умолчанию стоит utf8.
ps. Пишу этот пост и для себя, чтобы потом долго не вспоминать, что куда писать.