LINUX.ORG.RU

mysql кодировка соединения. давайте разберёмся наконец!

 , , ,


0

1

мучает меня вопрос давно, на каком основании выбирается кодировка соединения клиента mysql.

в данный момент ф. на php mysql_client_encoding($link) возращает: The current character set is: latin1

почему?? ведь у меня всё что можно установлено в utf-8.

в php-скрипте посылается заголовок:

header('Content-type: text/html; charset=utf-8');

дополнительно печатаются теги (всё по w3c):

echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/></head>';

на сервере тоже всё в utf-8:

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

mysql> show variables like 'col%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

сама БД и Таблица тоже в utf-8:

mysql> show create table prtg;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| prtg  | CREATE TABLE `prtg` (
  `id_prtg` int(11) NOT NULL AUTO_INCREMENT,
  `device_id` int(11) DEFAULT NULL,
  `device_ip` varchar(20) DEFAULT NULL,
  `device_name` varchar(20) DEFAULT NULL,
  `device_name_short` varchar(10) DEFAULT NULL,
  `sensor_info` varchar(255) DEFAULT NULL,
  `sensor_cash_num` int(11) DEFAULT NULL,
  `sensor_cash_address` varchar(100) DEFAULT NULL,
  `sensor_cash_phone` varchar(50) DEFAULT NULL,
  `sensor_cash_isp` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id_prtg`)
) ENGINE=MyISAM AUTO_INCREMENT=765 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create schema offices;
+----------+------------------------------------------------------------------+
| Database | Create Database                                                  |
+----------+------------------------------------------------------------------+
| offices  | CREATE DATABASE `offices` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)

в конфигурационном файле веб-сервера apache кодировка по умолчанию закоментирована (чтобы кодировка выбиралась на основе того в какой кодировке сохранён документ или какие заголовки посланы).

#AddDefaultCharset UTF-8

в конфигурационном файле php.ini тоже кодировка по умолчанию закоментирована

;default_charset = "iso-8859-1"

так скажите люди добрые откуда же берется кодировка соединения latin1?

сил моих нет гуглить, везде пишут одно и тоже: используйте set names или настройте mysql принудительно принимать кодировку соединения.. Почему я должен принудительно указывать каждый раз в какой кодировке устанавливать соединения?? Ну, бред блин!!! На каком-то же основании он выбирает latin1! Откуда он его берёт?


Совсем охамела школота, ничего настраивать не хочет....
Небось еще и маны не читал...
Валите уже в свой уютненький виндовз восемь со спираченым мысыскулем... там ничего не надо настраивать!

Jetty ★★★★★ ()

Какое отношение твой HTTP header имеет к конекту к БД? Просто по дефолту используется latin1 вот и все. Нужна другая кодировка так установи. Другое дело что наверное во всех современных либах/фреймворках utf8 сконфигурирован по умолчанию.

urxvt ★★★★★ ()
Ответ на: комментарий от urxvt

вопрос можно перефразировать след. образом: где «по дефолту используется latin1»?

пы.сы. я приводил листинг того как я настроил mysql (там установлено utf8).

maza ()

mysql php кодировка set names

Годы шли, в полку пхпшников одни и теже проблемы героически решались ежедневно, каждым бойцом...

Alve ★★★★★ ()
Ответ на: комментарий от maza

MySQL в европах где-то делали. Вот и забили по умолчанию. Таблицы тоже создаются в latin1, а сортировка финская чтоли.

В последних версия уже вроде поправили на utf.

vahtu ()
Ответ на: комментарий от sjinks

ребята, прочтите, пожалуйста полностью мой первый пост и проникнитесь вопросом! Зачем писать абы что?!

Интересует каким образом клиент решает использовать latin1 по умолчанию?

Или Что нужно сделать, чтобы по умолчанию использовалась кодировка соединения utf8? (Обратите внимание на конфигурацию, которую я привёл в первом сообщении!)

maza ()

пых и мускуль.
Убейте меня кто-нибудь.

JFreeM ★★★☆ ()
Ответ на: комментарий от maza

Интересует каким образом клиент решает использовать latin1 по умолчанию?

Считай что в сорцах mysqld это захардкодено.

urxvt ★★★★★ ()
Ответ на: комментарий от greek_31

вот троли и флудеры делать нечего что ли кроме как тыркать бездумно по клавиатуре?!

проникся я в первую очередь конфигом мускула и разъясню смысл моей фразы в первом сообщении: «везде пишут одно и тоже: используйте set names или настройте mysql принудительно принимать кодировку соединения»

конкретно имело ввиду, чтобы заставить клиента соединятся в нужной кодировке есть несколько вариантов:

1) после подключения к субд послать команду: set names utf8;
2) настроить сервер автоматически посылать эту команду при соединении, используя директиву init-command;
3) настроить сервер игнорировать установку кодировки клиентом с помощью директивы skip-character-set-client-handshake и использовать кодировку по умолчанию (наверняка использовать то, что в директиве default-character-set, которая в секции [mysql], [client]);

но эти все варианты грубые и создадут проблемы, когда действительно какому-то клиенту понадобится отличная кодировка от той, что жёстко указана на сервере.

p.s.: когда искал на dev.mysql.com директиву skip-character-set-client-handshake наткнулся на сharacter-set-client-handshake.

character-set-client-handshake

Type: boolean
Default: TRUE
Do not ignore character set information sent by the client. To ignore client information and use the default server character set, use --skip-character-set-client-handshake; this makes MySQL behave like MySQL 4.0.
я так понял от --skip-character-set-client-handshake отказываются и придумали character-set-client-handshake, который по дефолту выставлен в TRUE, что означает, что сервер будет принимать во внимание запрос на кодировку в которой клиент хочет передавать данные. (так что утверждение, что кодировка latin1 захордкордина в сорцах ставится под сомнение).

Осталось понять каким тогда образом клиент сообщает в какой кодировке он хочет работать. - вот она суть вопроса!

у меня была гипотеза, что это происходит на основе того какие заголовки были посланы (php func. header() или html-тег <meta>) и в какой кодировке вообще сохранён документ, но это не так, по крайней мере - не помогло.

повторюсь, есть функция на php mysql_client_encoding(), которая возращает мне latin1, если бы удалось узнать как работает эта функция, то думаю можно было бы понять как по дефолту получается эта самая latin1.

maza ()
Ответ на: комментарий от maza

повторюсь, есть функция на php mysql_client_encoding(), которая возращает мне latin1, если бы удалось узнать как работает эта функция, то думаю можно было бы понять как по дефолту получается эта самая latin1.

Эта функция просто возвращает значение character_set из линка с mysql. То, как она работает, тебе никакого ответа на вопрос не даст.

Ну а если любишь так геттеры и сеттеры, то почему бы не заюзать mysql_set_charset() или mysqli_character_set_name()?

то что ты в header пихаешь или вообще в HTML - это совсем другой уровень работы и он вообще никак не взаимодействует с БД. И даже то что у тебя в апаче действует только на то, в какой кодировке СЕРВЕР ОТДАЕТ КЛИЕНТУ, а не базе.

BaBL ★★★★★ ()
Ответ на: комментарий от maza

повторюсь, есть функция на php mysql_client_encoding(), которая возращает мне latin1, если бы удалось узнать как работает эта функция, то думаю можно было бы понять как по дефолту получается эта самая latin1.

Ну так почитай сорцы, если так уверен. Только вот функция эта никак не связана с тем, что mysql использует по дефолту.

Хотя после того, что ты тут уже нагородил, предположение уже не удивительно.

lllnk ()

Ох уж эти похапешники ...

Пропиши в /etc/my.cnf в секции [client], [mysqld] и [mysql] по строчке default-character-set=utf8

ef37 ★★ ()
Ответ на: комментарий от lllnk

mysql_client_encoding()

Ладно, согласен, что алгоритм работы mysql_client_encoding() не ответит на мой вопрос, но зачем отклонятся от сути?

Осталось понять каким тогда образом клиент сообщает в какой кодировке он хочет работать. - вот она суть вопроса!

2ef37:

Пропиши в /etc/my.cnf в секции [client], [mysqld] и [mysql] по строчке default-character-set=utf8

это уже сделано, см. первый пост, листинг «на сервере тоже всё в utf-8:»

mysql> show variables like 'char%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+

mysql> show variables like 'col%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+

maza ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.