Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Странная штука с кодировкой в mysql

360
27 сентября 2013 года
P*t*
474 / / 15.02.2007
У меня в системе (ubuntu 12.04) в качестве стандартной кодировки используется utf8.
mysql вполне успешно работает с кириллицей.
Однако, если написать в запросе SET CHARACTER SET 'utf8' (что, казалось бы, в моем случае не должно ни на что влиять), кириллица перестает восприниматься. В чем может быть дело?

Код:
bash$ echo $LANG
ru_RU.UTF-8

bash$ mysql
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 15305
Server version: 5.5.32-0ubuntu0.12.04.1 (Ubuntu)
...

mysql> SELECT 'текст на русском';
+--------------------------------+
| текст на русском               |
+--------------------------------+
| текст на русском               |
+--------------------------------+
1 row in set (0.00 sec)

mysql> SET CHARACTER SET 'utf8';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT 'текст на русском';
+------------------+
| ????? ?? ??????? |
+------------------+
| ????? ?? ??????? |
+------------------+
1 row in set (0.00 sec)
360
27 сентября 2013 года
P*t*
474 / / 15.02.2007
Проблема решилась.
Надо было добавить character-set-server = utf8 в секцию [mysqld] my.cnf

Причина описана здесь: http://help.ubuntu.ru/wiki/mysql
На default-character-set сервер mysql почему-то ругался, но после замены на character-set-server все заработало

Код:
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Единственное -- я до сих пор не могу понять, как так получилось, что SET CHARACTER SET utf8 меняла character_set_connection с utf8 на latin1
4
27 сентября 2013 года
mike
3.7K / / 01.10.2002
Может дело в настройках клиента? Может попробовать указать кодировку в секции [mysql] в my.cnf?
414
27 сентября 2013 года
CassandraDied
763 / / 24.05.2012
А в БД точно заносятся UTF8 строки?
360
27 сентября 2013 года
P*t*
474 / / 15.02.2007
Добавил default-character-set=utf8 в my.cnf в секции [client] и [mysql].
Также попробовал указать --default-character-set=utf8 в опциях командной строки.
Ничего не изменилось: до SET CHARACTER SET 'utf8' кириллица работает, после -- нет.

Конечно можно просто убрать этот SET CHARACTER SET -- без него все работает правильно. Но хотелось бы разобраться.

Кодировка везде в системе utf8, другой неоткуда взяться.
Код:
bash$ locale
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
412
27 сентября 2013 года
grgdvo
323 / / 04.07.2007
А что выдает SHOW VARIABLES LIKE 'character_set%'; до и после SET?
8
27 сентября 2013 года
mfender
3.5K / / 15.06.2005
Для потехи рекомендую при подключении объявлять SET NAMES utf8
Ну или какую там в зависимости от установленных кодировок на компутере.
360
27 сентября 2013 года
P*t*
474 / / 15.02.2007
У меня при подключении использовались обе команды:
 
Код:
SET NAMES utf8;
SET CHARACTER SET utf8;
Выяснив, что кодировка ломается после второй, я написал только про нее.

SHOW VARIABLES LIKE 'character_set%' показывает интересные вещи:
Код:
bash$ mysql
...
mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> SET CHARACTER SET utf8;
Query OK, 0 rows affected (0.00 sec)

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

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
Получается, что SET CHARACTER SET портит character_set_connection, а SET NAMES возвращает его обратно.
Значит, если бы я изначально расположил эти команды в другом порядке, ошибка бы осталась незамеченной.

Сейчас буду искать, откуда вылезло latin1.
412
28 сентября 2013 года
grgdvo
323 / / 04.07.2007
У вас была ...database=latin1
A set character set меняет connection на database
Здесь http://dev.mysql.com/doc/refman/5.5/en/charset-connection.html расписано.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог