Автор Тема: my.cnf кодировку latin1 поменять на utf8 [Решено]  (Прочитано 4804 раз)

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Добрый вечер!
Хотелось бы базу данных MySQL (MariaDB) перевести полностью на utf8.

Сейчас:
MariaDB [(none)]> show variables like 'char%';
+--------------------------+----------------------------+
| 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)

MariaDB [(none)]> show variables like 'coll%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

MariaDB [(none)]>
Вручную переводится
MariaDB [(none)]> set character_set_database=utf8;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> set character_set_server=utf8;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

MariaDB [(none)]> show variables like 'coll%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

MariaDB [(none)]>
Но это же каждый раз надо делать.

Почитал, что можно один раз изменить файл my.ini или my.cnf, тогда параметры станут "по умолчанию".

my.ini вообще не нашел, my.cnf две штуки.
[root@alt ~]# find / -name "my.ini"
[root@alt ~]# find / -name "my.cnf"
/etc/my.cnf
/home/userm/.kde4/share/apps/amarok/my.cnf
[root@alt ~]#
Сомневаюсь что /home/userm/.kde4/share/apps/amarok/my.cnf - это то, что мне нужно. Остается /etc/my.cnf. Но про него вычитал, что его лучше не трогать, т.к. при обновлении linux/mysql может вылезти ошибка и вообще что то пойдет не так.

Там, кстати, почти ничего и нету
[root@alt ~]# cat /etc/my.cnf
#
# This group is read both both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[root@alt ~]#
Извечные вопросы: как быть и что делать?
« Последнее редактирование: 01.10.2016 16:29:10 от userm »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #1 : 29.09.2016 22:28:11 »
Не знаю подробностей, но судя по
!includedir /etc/my.cnf.d
Можно дополнительные конфиги класть сюда.


Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #2 : 29.09.2016 22:52:45 »
Цитировать
!includedir /etc/my.cnf.d
Действительно, конфиг обращается к другим конфигурационным файлам, которые распределены по своим задачам.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #3 : 29.09.2016 23:06:26 »
Можно покурить над https://packages.altlinux.org/ru/Sisyphus/srpms/mariadb/spec, или скачать сам пакет и "посмотреть его внутренности"

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #4 : 29.09.2016 23:11:02 »
Все оказалось очень просто. В файле /etc/my/cnf.d/server.cnf раскомментировал character.set_server=utf8
Спасибо!

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Рано обрадовался или чего то недопонял.
Создаю базу данных и таблицу в консоли:
MariaDB [(none)]> create database tdb;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> use tdb;
Database changed
MariaDB [tdb]> create table tbl(rus varchar(255));
Query OK, 0 rows affected (0.04 sec)

MariaDB [tdb]> insert into tbl(rus) values ('Текст из консоли');
Query OK, 1 row affected (0.01 sec)

MariaDB [tdb]> select * from tbl where rus like 'текст%';
+--------------------------------+
| rus                            |
+--------------------------------+
| Текст из консоли               |
+--------------------------------+
1 row in set (0.00 sec)

MariaDB [tdb]>
Вроде все прекрасно. Но если начать использовать PHP - радость пропадает:
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Test</title>
  </head>
  <body>
<?php
$server_db 
mysqli_connect("localhost""root""""tdb");
$query_result mysqli_query($server_db"insert into tbl(rus) values ('Текст из скрипта')");
$query_result mysqli_query($server_db"select * from tbl");
while(
$row mysqli_fetch_row($query_result))
{
  
print_r($row);
}
?>

  </body>
</html>
т.к. результат скрипта:
Array ( [0] => ????? ?? ??????? ) Array ( [0] => Текст из скрипта )
Консоль тоже понимает только свое:
MariaDB [tdb]> select * from tbl;
+---------------------------------------------------------------+
| rus                                                           |
+---------------------------------------------------------------+
| Текст из консоли                                              |
| ТекÑÑ‚ из Ñкрипта                                |
+---------------------------------------------------------------+
2 rows in set (0.00 sec)

MariaDB [tdb]>
Настройки обещают, что все будет в utf8:
MariaDB [tdb]> 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

MariaDB [tdb]> show variables like 'coll%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

MariaDB [tdb]> show create database tdb;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| tdb      | CREATE DATABASE `tdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [tdb]> show create table tbl;
+-------+---------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                |
+-------+---------------------------------------------------------------------------------------------+
| tbl   | CREATE TABLE `tbl` (
  `rus` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [tdb]>
Подумал может влияет кодировка самого файла test.php (utf8 с bom/без bom), попробовал оба варианта - результат не изменился.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #6 : 30.09.2016 08:57:41 »
ткну пальцем в небо. А у php не надо включать ни какую поддержку utf8  ?
« Последнее редактирование: 30.09.2016 09:07:00 от ruslandh »

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #7 : 30.09.2016 09:01:00 »
Интересно, а как php узнает в какой кодироыювке используется текстовые константы?  Обычные приложения берут из локали,заданной в окружении. А какое у вас окружение?

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #8 : 30.09.2016 09:12:38 »
| Текст из консоли                                              |
| ТекÑÑ‚ из Ñкрипта
по внешнему виду - консоль настроена на 8-битку, а получает из mysql utf8 - проблема не в самом mysql, а в приложениях, которые полдучают от него данные - они почему-то ожидают 8-битку.

Если число вопросиков верно отображено, то их меньше, и оно совпадает с числом знаков в строке, и тут какая-то другая проблема, связанная с правильным отображением символов в кодировке utf8.
(шрифты и т.п.)

Оффлайн Skull

  • Глобальный модератор
  • *****
  • Сообщений: 19 908
    • Домашняя страница
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #9 : 30.09.2016 09:19:20 »
Проблема явно в коде на PHP.
Андрей Черепанов (cas@)

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #10 : 30.09.2016 09:22:05 »
Попробовал создать базу данных и таблицу в PHP:
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Test</title>
  </head>
  <body>
<?php
$server_db 
mysqli_connect("localhost""root""""");
$query_result mysqli_query($server_db"create database tdb");
mysqli_close($server_db);

$server_db mysqli_connect("localhost""root""""tdb");
$query_result mysqli_query($server_db"create table tbl(rus varchar(255))");
$query_result mysqli_query($server_db"insert into tbl(rus) values ('Текст из скрипта')");
$query_result mysqli_query($server_db"select * from tbl");
while(
$row mysqli_fetch_row($query_result))
{
  
print_r($row);
}
mysqli_close($server_db);
?>

  </body>
</html>
Консоль продолжает утверждать что везде utf8:
MariaDB [(none)]> show create database tdb;
+----------+--------------------------------------------------------------+
| Database | Create Database                                              |
+----------+--------------------------------------------------------------+
| tdb      | CREATE DATABASE `tdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+--------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [(none)]> use tdb;
Database changed
MariaDB [tdb]> show create table tbl;
+-------+---------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                |
+-------+---------------------------------------------------------------------------------------------+
| tbl   | CREATE TABLE `tbl` (
  `rus` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MariaDB [tdb]>
Если я правильно понимаю, то консоль работает в utf8:
[userm@alt ~]$ locale
LANG=ru_RU.UTF-8
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=
[userm@alt ~]$
Цитировать
ткну пальцем в небо. А у php не надо включать ни какую поддержку utf8  ?
Хотелось бы знать...
Цитировать
Проблема явно в коде на PHP.
Тоже так думаю

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #11 : 30.09.2016 09:22:53 »
Проблема явно в коде на PHP.
Вот в C для работы с строками на русском, я задаю локаль кода (если он может не совпадать с локалью где компилируется и запускается приложение). Наверное в php то-же самое должно быть.

Оффлайн ruslandh

  • Поспешай не торопясь !
  • Модератор глобальный
  • *****
  • Сообщений: 32 246
  • Учиться .... Телепатами не рождаются, ими ....
    • Email

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #13 : 30.09.2016 09:33:45 »
Цитировать
https://www.google.ru/search?q=setlocale+php+русский+utf-8&ie=utf-8&oe=utf-8&gws_rd=cr&ei=6QTuV-bYDYae6ASN1YqgBA
Буду изучать.

Кстати,  PHP почему то ругается на mb_detect_encoding, говорит функция не определена.

Оффлайн userm

  • Давно тут
  • **
  • Сообщений: 68
Re: my.cnf кодировку latin1 поменять на utf8
« Ответ #14 : 30.09.2016 10:22:22 »
Попробовал setlocale(LC_ALL, 'ru_RU.UTF-8');
даже if(setlocale(LC_ALL, 'ru_RU.UTF-8')) echo "setlocale OK<br>\r\n"; else echo "setlocale BAD<br>\r\n";
пишет setlocale OK, но в консоли так же выводит крякозябры.