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

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-08 20:52:04

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

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

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 7:12:42

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

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

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

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 7:14:25

тема использования кодировок в мусе http://forum.lissyara.su/viewtopic.php?p=59364#p59364

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-09 7:24:55

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

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, сортируется не согласно алфавита русского

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 8:24:26

Скрипт консольный?

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

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%';
и это... из какой таблицы ты данные выбираешь?

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-09 9:38:29

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

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 выдавал нормальную русскую кодировку. Вопрос, а как это сделать?

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 10:18:29

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 позволяет легко хранить данные в одной кодировке, а перекодировку делать на лету, важно, чтобы изначально была выставлена нужная кодировка.

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

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-09 10:40:53

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)
А раньше А и Б в одной таблице вылазило.

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 10:50:48

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

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-09 10:58:26

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-09 11:35:43

ну если по ссылкам ходить лень, то могу процитировать )))
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

Corwin
мл. сержант
Сообщения: 100
Зарегистрирован: 2008-02-15 16:53:24

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

Непрочитанное сообщение Corwin » 2008-05-09 11:39:25

Спасибо большое за информацию :) Очень даже информативно :)

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2008-05-10 9:45:43

когда ж всё на UTF то будет. Жду недождусь.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2008-05-10 19:30:23

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-11 18:39:19

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

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-11 21:40:34

http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

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

Непрочитанное сообщение dikens3 » 2008-05-11 22:07:02

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

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

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

character_set_system - кодировка, в которой работает задаются идентификаторы MySQL, всегда UTF8
Ну и прогони через Word, ошибки есть.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-12 7:09:21

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

Аватара пользователя
BlackCat
прапорщик
Сообщения: 469
Зарегистрирован: 2007-10-16 22:40:42

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

Непрочитанное сообщение BlackCat » 2008-05-12 18:30:43

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

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2008-05-12 20:01:06

ошибки подправлены, статья отправилась в раздел www, из того, что писал, сам много понял :D
BlackCat писал(а):может теперь реже будут кидаться делать "ALTER TABLE" при виде вопросиков, вместо данных
ыыыхх, грабли они на то и грабли, чтоб на них вставать :)