Пришло время описать установку и настройку mysql сервера версии 5.5 с кодировками utf-8 по умолчанию.
1) Подготовка
Добавляем такие строки в /etc/make.conf
DEFAULT_MYSQL_VER=55
PORTSDIR?= /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql55-server
WITH_CHARSET=utf8
WITH_COLLATION=utf8_bin
BUILD_OPTIMIZED=yes
BUILD_STATIC=yes
WITH_XCHARSET=all
.endif
.if ${.CURDIR} == ${PORTSDIR}/databases/mysql55-client
WITH_CHARSET=utf8
WITH_COLLATION=utf8_bin
BUILD_OPTIMIZED=yes
.endif
Кстати, если заглянуть в порт /usr/ports/databases/mysql55-server то в файле Makefile опций вы не обнаружите. Их можно взять, например, из порта /usr/ports/databases/mysql51-server.
2) Установка
Теперь можно приступать к установке:
#cd /usr/ports/databases/mysql55-server && make install clean
3) Настройка
После установки создаём файл /etc/my.cnf такого содержания:
[mysqld]
#bind-address = 127.0.0.1
socket= /tmp/mysql.sock
skip-networking
character-set-server=utf8
collation-server=utf8_general_ci
init_connect='SET collation_connection = utf8_general_ci'
init-connect='SET NAMES utf8'
log_error=/var/log/mysql/error.log
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time = 5
log-queries-not-using-indexes
default-storage-engine = innodb
innodb_file_per_table
innodb_file_format=barracuda
local-infile=0
[mysqldump]
default-character-set=utf8
[client]
default-character-set = utf8
Добавляем строку
mysql_enable="YES"
в /etc/rc.conf
Меняем права:
#chown -R mysql:mysql /var/db/mysql/
и запускаем:
#/usr/local/etc/rc.d/mysql-server start
Если в логах получаем ошибку
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
Проверьте, стоит ли владелец mysql:mysql. Если стоит, а всё равно не запускается, удалите каталог /var/db/mysql/mysql (скорее всего он пуст) и запустите снова:
#/usr/local/etc/rc.d/mysql-server start
4) Проверка.
Что бы проверить, правильно ли у нас установлена кодировка, выполним такую команду:
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/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.38 sec)
mysql> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)
Значит всё правильно.
Либо тоже самое, но через mysqladmin:
#mysqladmin variables | egrep 'collation|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/local/share/mysql/charsets/
| collation_connection | utf8_general_ci
| collation_database | utf8_general_ci
| collation_server | utf8_general_ci
А полный список поддерживаемых кодировок можно узнать по команде:
mysql>SHOW CHARACTER SET;
5) Просмотр и смена кодировки уже существующей базы
mysql> create database AAA DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin;
mysql> show create database AAA;
+----------+------------------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------------------+
| AAA | CREATE DATABASE `AAA` /*!40100 DEFAULT CHARACTER SET cp1251 COLLATE cp1251_bin */ |
+----------+------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> use AAA;
Database changed
mysql> show variables like "character_set_database";
+------------------------+--------+
| Variable_name | Value |
+------------------------+--------+
| character_set_database | cp1251 |
+------------------------+--------+
1 row in set (0.00 sec)
mysql> show variables like "%colla%";
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | cp1251_bin |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
Попробуем изменить кодировку на koi8-r
mysql> alter database `AAA` character set koi8r;
Query OK, 1 row affected (0.00 sec)
mysql> show variables like "%colla%";
+----------------------+------------------+
| Variable_name | Value |
+----------------------+------------------+
| collation_connection | utf8_general_ci |
| collation_database | koi8r_general_ci |
| collation_server | utf8_general_ci |
+----------------------+------------------+
3 rows in set (0.01 sec)
mysql> show variables like "character_set_database";
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | koi8r |
+------------------------+-------+
1 row in set (0.01 sec)
Собственно видим, что кодировка изменилась.
5) Пару слов о кодировках.
Допустим такую ситуацию. Вы используете PhpMyAdmin с кодировкой UTF8, а консоль у вас KOI8R. Естественно, хочется, что бы всё нормально отображалось и в консоли и в вебке. Для этого служит команда:
mysql>SET NAMES KOI8R;
которая объясняет серверу, в какой кодировке выводить данные. Естественно, каждый раз вводить это неудобно и для этого можно поместить в my.cnf:
[mysqld]
init-connect='SET NAMES koi8r'
НО! Если вы обладаете правами SUPER (например, root), то для вас это не сработает. Придётся вручную каждый раз вводить. Читал, что это сделано специально.
4 коментарі “[mysql] Установка сервера mysql 5.5”
У меня на 5.5.13 это уже не работает.
MySQL собирается с помощью CMake, поэтому нужно немного править Makefile
Например где-то после строк
.if defined(WITH_FASTMTX)
CMAKE_ARGS+= -DWITH_FAST_MUTEXES=1
.endif
Можно вставить такое для выбора настроек сервера по умолчанию.
CMAKE_ARGS+= -DDEFAULT_CHARSET=”utf8″
CMAKE_ARGS+= -DDEFAULT_COLLATION=”utf8_general_ci”
CMAKE_ARGS+= -DEXTRA_CHARSETS=”all”
Если будет время попробую сделать и предложить маинтейнеру патч для порта, чтобы было похоже на то как было раньше.
Спасибо! Очень нужная статья – подробно все указано.
Спасибо.
Но для нас, для ламеров, нужно бы дописать
#chown -R mysql:mysql /var/log/mysql/
иначе счастья не видать…
Hi.
Если прописываешь в my.cnf то мускуль можно и не пересобирать. А вот за статью спасибо – если бы не каммент Богдана еще бы долго искал, как мускуль по-правильному собрать.
.if ${.CURDIR:N*/usr/ports/databases/mysql55-server} == “”
CMAKE_ARGS+= -DDEFAULT_CHARSET=utf8
CMAKE_ARGS+= -DDEFAULT_COLLATION=utf8_general_ci
.endif
В итоге вот такое:
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/local/share/mysql/charsets/ |
+————————–+———————————-+
8 rows in set (0.01 sec)
З.Ы. клиента бесполезно пересобирать – он кодировку и так берет из окружения.
З.Ы. перевести базу в другую кодировку можно очень просто через phpmyadmin. Открываешь базу, отмечаешь все таблицы, нажимаешь сверху “Опции” и выбираешь нужную кодировку для collation. И все.