Страница 1 из 1
Сортировка кириллцы в MySQL
Добавлено: 2008-05-08 20:52:04
Corwin
Добрый день. Вопрос следующего содержания: при выборке кириилическиз имён, некорректно выводится список с данными, к параметру поиска не принадлежащий (то есть, с тем что надо выводится и то, что к параметрам поиска не относиться).
Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
Re: Сортировка кириллцы в MySQL
Добавлено: 2008-05-09 7:12:42
zg
Corwin писал(а):Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
сделай следующее
и результат выложи сюда
скорее всего с кодировками у тебя проблемы
Re: Сортировка кириллцы в MySQL
Добавлено: 2008-05-09 7:14:25
zg
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>
покажи запрос
и это... из какой таблицы ты данные выбираешь?
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
В общем, я вставил вот это ,(вверху) в блок [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 очень кратко написано. Самому силы воли не хватило и точных знаний
ыыыых у мну тоже силы воли нету...
ок, небольшую памятку оставлю, если есть пожелания, пишите, на статью тут как-то не ахти

Re: Сортировка кириллцы в MySQL
Добавлено: 2008-05-11 21:40:34
zg
http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе
Re: Сортировка кириллцы в MySQL
Добавлено: 2008-05-11 22:07:02
dikens3
1. По поводу раздела лучше спросить у Лиса, он скоро появится.
2. В меню есть справка (нажми, там написаны номера разделов), я бы рекомендовал пока раздел 28 (28 - статьи -—> FreeBSD -—> Мелочи)
P.S. Доходчиво написано.
Код: Выделить всё
character_set_system - кодировка, в которой работает задаются идентификаторы MySQL, всегда UTF8
Ну и прогони через Word, ошибки есть.
Re: Сортировка кириллцы в MySQL
Добавлено: 2008-05-12 7:09:21
zg
dikens3 писал(а):Ну и прогони через Word, ошибки есть.

а как без них-то

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

Особенно примеры порадовали

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