Страница 1 из 1

Сортировка кириллцы в MySQL

Добавлено: 2008-05-08 20:52:04
Corwin
Добрый день. Вопрос следующего содержания: при выборке кириилическиз имён, некорректно выводится список с данными, к параметру поиска не принадлежащий (то есть, с тем что надо выводится и то, что к параметрам поиска не относиться).

Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 7:12:42
zg
Corwin писал(а):Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
сделай следующее

Код: Выделить всё

SHOW CREATE TABLE `таблица`
и результат выложи сюда

скорее всего с кодировками у тебя проблемы

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 7:14:25
zg
тема использования кодировок в мусе http://forum.lissyara.su/viewtopic.php?p=59364#p59364

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 7:24:55
Corwin

Код: Выделить всё

mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 408
Server version: 5.1.20-beta-log FreeBSD port: mysql-server-5.1.20

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use mysql
Database changed
mysql> SHOW CREATE TABLE `таблица`;
ERROR 1146 (42S02): Table 'mysql.ц?ц?ц?ц?ц?ц?ц?' doesn't exist
mysql>
Вот что выдаёт данный запрос.

На самом деле, скрипты в консоли на perl выдают нормальное отображение на русском языке содержимое полей в базе. Но вот выборка при поиске и сортировка... То есть задача следующая:
- нужно с помощью скрипта поиска выбрать определённые значения из полей таблицы, которые написаны русскими словами. Но извлекаются слова, которые наряду с тем что нужно, выбирает то, что совсем не соответствует значениям, которые надо выбрать...И когда делаешь сортировку order by, сортируется не согласно алфавита русского

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 8:24:26
zg
Скрипт консольный?

Код: Выделить всё

mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | cp1251                           |
| character_set_connection | cp1251                           |
| character_set_database   | cp1251                           |
| character_set_filesystem | binary                           |
| character_set_results    | cp1251                           |
| character_set_server     | cp1251                           |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)

mysql>
покажи запрос

Код: Выделить всё

show variables like 'char%';
и это... из какой таблицы ты данные выбираешь?

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 9:38:29
Corwin

Код: Выделить всё

mysql> use telecom
Database changed
mysql> show variables like 'char%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | latin1                           |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
| character_set_server     | cp1251                           |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/share/mysql/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)
Вот такой вот вывод. Скрипт в консоли выдаёт на русском языке. В общем, я так понимаю, что нужно вот это переправить на cp1251:

Код: Выделить всё

| character_set_client     | latin1                           |
| character_set_connection | latin1                           |
| character_set_database   | latin1                           |
| character_set_filesystem | binary                           |
| character_set_results    | latin1                           |
для того, чтобы клиент на Delfi или Java выдавал нормальную русскую кодировку. Вопрос, а как это сделать?

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 10:18:29
zg
Corwin писал(а):для того, чтобы клиент на Delfi или Java выдавал нормальную русскую кодировку. Вопрос, а как это сделать?
Для делфи скорее всего нужно использовать cp1251, для явы не знаю, а сделать это можно двумя сопсобами:
1. изменить кодировку в настройках сервера

Код: Выделить всё

game# cat /etc/my.cnf
...
# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql.sock

default-character-set=cp1251

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
default-character-set=cp1251

bind-address    = 127.0.0.1
port            = 3306
socket          = /tmp/mysql.sock
....
2. использовать кодировку непосредственно в запросах при подключении, создании таблиц и баз данных. MySQL позволяет это делать легко и естественно.

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

В принципе MySQL позволяет легко хранить данные в одной кодировке, а перекодировку делать на лету, важно, чтобы изначально была выставлена нужная кодировка.

Прежде чем экспериментировать, сделай бэкап базы :)

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 10:40:53
Corwin
zg писал(а):

Код: Выделить всё

[client]
default-character-set=cp1251
В общем, я вставил вот это ,(вверху) в блок [client] в/etc/my.cnf и всё заработало :)))

Код: Выделить всё

mysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.1.20-beta-log FreeBSD port: mysql-server-5.1.20

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use alcatel_test
Database changed
mysql> SET NAMES koi8r;
Query OK, 0 rows affected (0.00 sec)

mysql> select nom,abon from alcatel_test.alcatel1 where abon like 'Б%' and kodorg=0;
+-------+--------------------------------------+
| nom   | abon                                 |
+-------+--------------------------------------+
| 47025 | БАБАНИЯЗОВ Б.Х.                      |
| 43861 | БАБЕНКО Н.К.                         |
| 47516 | БАБИЧ Т.П.                           |
[вырезано]
| 43384 | БЫКА И.И.                            |
| 45075 | БУРМИСТРОВ В.А.                      |
+-------+--------------------------------------+
119 rows in set (0.02 sec)
А раньше А и Б в одной таблице вылазило.

Огроменное спасибо :)

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 10:50:48
zg
Corwin писал(а):В общем, я вставил вот это ,(вверху) в блок [client] в/etc/my.cnf и всё заработало :)))
))) если не хочешь проблем в будущем, то лучше ещё научиться выставлять кодировки через соединение и запросы :) Удачи

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 10:58:26
Corwin
zg писал(а): ))) если не хочешь проблем в будущем, то лучше ещё научиться выставлять кодировки через соединение и запросы :) Удачи
Через соединение - это в скриптах соединения к базе и в запросах, что используются в скриптах? То есть конвертация на лету, да?

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 11:35:43
zg
ну если по ссылкам ходить лень, то могу процитировать )))
zg писал(а):При создании таблицы указываешь дефолтную кодировку

Код: Выделить всё

CREATE TABLE `c_razdely_info` (
  `id` varchar(60) NOT NULL default '',
  `name` varchar(60) NOT NULL default '',
  `type` varchar(60) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
из пхп юзается так

Код: Выделить всё

// Соединение с базой данных
@mysql_connect('localhost', 'root') || die('Can\'t connect to database');

// Настройки соединения
my_query('USE `dbname`');
my_query( 'set character_set_client=51' );
my_query( 'set character_set_results=51' );
my_query( 'set character_set_connection=51' );
51 - это cp1251
важно следующее:
1. исходная кодировка базы данных
2. кодировка результата и клиента

Указывая кодировку таблицы, ты сообщаешь исходную кодировку данных, которые в ней хранятся. Указывая кодировку на результат и соединение, ты сообщаешь конечную кодировку. Остальную работу берётся на себя MySQL.

Настройки сервера далают эту работу за тебя, но важно понимать как это работает.

К примеру ты хочешь хранить данные в UTF-8, а работать с ними посредством cp1251, то

Код: Выделить всё

1. Создание базы
mysql> create database test charset UTF8;
Query OK, 1 row affected (0.00 sec)

2. Создание таблицы
mysql> create table `t` (`text` TEXT) charset=UTF8;
Query OK, 0 rows affected (0.00 sec)
таким образом MySQL "узнает" кодировку, в которой нужно хранить данные

А дальше? после подключения к базе данных, мы указываем

Код: Выделить всё

# Кодировка, в которой будут поступать данные
set character_set_client=51;

# Кодировка, в которой нужно извлекать данные из базы
set character_set_results=51;

# Кодировка для соединения
set character_set_connection=51;
Таким образом данные будут храниться в UTF8, а клиент будет работать только с windows-1251. При этом если потребуется извлекать данные в UTF-8, то достаточно поменять character_set_results на UTF8

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-09 11:39:25
Corwin
Спасибо большое за информацию :) Очень даже информативно :)

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-10 9:45:43
dikens3
когда ж всё на UTF то будет. Жду недождусь.

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-10 19:30:23
BlackCat
zg, может статью напишете о кодировках в mySQL, будет большой респект от многих пользователей ;-) Инфы адекватной на русском нет (или я плохо искал), на mysql.com очень кратко написано. Самому силы воли не хватило и точных знаний :-(

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-11 18:39:19
zg
BlackCat писал(а): будет большой респект от многих пользователей Инфы адекватной на русском нет (или я плохо искал), на mysql.com очень кратко написано. Самому силы воли не хватило и точных знаний
ыыыых у мну тоже силы воли нету...

ок, небольшую памятку оставлю, если есть пожелания, пишите, на статью тут как-то не ахти :D

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-11 21:40:34
zg
http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-11 22:07:02
dikens3
zg писал(а):http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе
1. По поводу раздела лучше спросить у Лиса, он скоро появится.
2. В меню есть справка (нажми, там написаны номера разделов), я бы рекомендовал пока раздел 28 (28 - статьи -—> FreeBSD -—> Мелочи)

P.S. Доходчиво написано.

Код: Выделить всё

character_set_system - кодировка, в которой работает задаются идентификаторы MySQL, всегда UTF8
Ну и прогони через Word, ошибки есть.

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-12 7:09:21
zg
dikens3 писал(а):Ну и прогони через Word, ошибки есть.
:) а как без них-то :lol: вечером с женой исправлю )))

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-12 18:30:43
BlackCat
Хорошая статья получилась, может теперь реже будут кидаться делать "ALTER TABLE" при виде вопросиков, вместо данных ;-) Особенно примеры порадовали :mrgreen:

Re: Сортировка кириллцы в MySQL

Добавлено: 2008-05-12 20:01:06
zg
ошибки подправлены, статья отправилась в раздел www, из того, что писал, сам много понял :D
BlackCat писал(а):может теперь реже будут кидаться делать "ALTER TABLE" при виде вопросиков, вместо данных
ыыыхх, грабли они на то и грабли, чтоб на них вставать :)