Сортировка кириллцы в MySQL
Модератор: terminus
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Сортировка кириллцы в MySQL
Добрый день. Вопрос следующего содержания: при выборке кириилическиз имён, некорректно выводится список с данными, к параметру поиска не принадлежащий (то есть, с тем что надо выводится и то, что к параметрам поиска не относиться).
Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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/
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
сделай следующееCorwin писал(а):Может быть кто-то сталкивался с такой проблемой, чтобы организовать поиск по именам из кириллических символов?
Код: Выделить всё
SHOW CREATE TABLE `таблица`
скорее всего с кодировками у тебя проблемы
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
тема использования кодировок в мусе http://forum.lissyara.su/viewtopic.php?p=59364#p59364
-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Re: Сортировка кириллцы в MySQL
Код: Выделить всё
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, сортируется не согласно алфавита русского
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
Скрипт консольный?
покажи запрос
и это... из какой таблицы ты данные выбираешь?
Код: Выделить всё
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%';
-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Re: Сортировка кириллцы в MySQL
Код: Выделить всё
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)
Код: Выделить всё
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
Для делфи скорее всего нужно использовать cp1251, для явы не знаю, а сделать это можно двумя сопсобами:Corwin писал(а):для того, чтобы клиент на Delfi или Java выдавал нормальную русскую кодировку. Вопрос, а как это сделать?
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
....
На самом деле пердпочтительней всего использовать оба варианта сразу, поскольку это повысит надёжность при переносе проекта.
В принципе MySQL позволяет легко хранить данные в одной кодировке, а перекодировку делать на лету, важно, чтобы изначально была выставлена нужная кодировка.
Прежде чем экспериментировать, сделай бэкап базы

-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Re: Сортировка кириллцы в MySQL
В общем, я вставил вот это ,(вверху) в блок [client] в/etc/my.cnf и всё заработалоzg писал(а):Код: Выделить всё
[client] default-character-set=cp1251

Код: Выделить всё
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)
Огроменное спасибо

-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
))) если не хочешь проблем в будущем, то лучше ещё научиться выставлять кодировки через соединение и запросыCorwin писал(а):В общем, я вставил вот это ,(вверху) в блок [client] в/etc/my.cnf и всё заработало))

-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Re: Сортировка кириллцы в MySQL
Через соединение - это в скриптах соединения к базе и в запросах, что используются в скриптах? То есть конвертация на лету, да?zg писал(а): ))) если не хочешь проблем в будущем, то лучше ещё научиться выставлять кодировки через соединение и запросыУдачи
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
ну если по ссылкам ходить лень, то могу процитировать )))
1. исходная кодировка базы данных
2. кодировка результата и клиента
Указывая кодировку таблицы, ты сообщаешь исходную кодировку данных, которые в ней хранятся. Указывая кодировку на результат и соединение, ты сообщаешь конечную кодировку. Остальную работу берётся на себя MySQL.
Настройки сервера далают эту работу за тебя, но важно понимать как это работает.
К примеру ты хочешь хранить данные в UTF-8, а работать с ними посредством cp1251, то таким образом MySQL "узнает" кодировку, в которой нужно хранить данные
А дальше? после подключения к базе данных, мы указываем Таким образом данные будут храниться в UTF8, а клиент будет работать только с windows-1251. При этом если потребуется извлекать данные в UTF-8, то достаточно поменять character_set_results на UTF8
важно следующее: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;
51 - это 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' );
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)
А дальше? после подключения к базе данных, мы указываем
Код: Выделить всё
# Кодировка, в которой будут поступать данные
set character_set_client=51;
# Кодировка, в которой нужно извлекать данные из базы
set character_set_results=51;
# Кодировка для соединения
set character_set_connection=51;
-
- мл. сержант
- Сообщения: 100
- Зарегистрирован: 2008-02-15 16:53:24
Re: Сортировка кириллцы в MySQL
Спасибо большое за информацию
Очень даже информативно 


- dikens3
- подполковник
- Сообщения: 4856
- Зарегистрирован: 2006-09-06 16:24:08
- Откуда: Нижний Новгород
- Контактная информация:
Re: Сортировка кириллцы в MySQL
когда ж всё на UTF то будет. Жду недождусь.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
- BlackCat
- прапорщик
- Сообщения: 469
- Зарегистрирован: 2007-10-16 22:40:42
Re: Сортировка кириллцы в MySQL
zg, может статью напишете о кодировках в mySQL, будет большой респект от многих пользователей
Инфы адекватной на русском нет (или я плохо искал), на mysql.com очень кратко написано. Самому силы воли не хватило и точных знаний 


-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
ыыыых у мну тоже силы воли нету...BlackCat писал(а): будет большой респект от многих пользователей Инфы адекватной на русском нет (или я плохо искал), на mysql.com очень кратко написано. Самому силы воли не хватило и точных знаний
ок, небольшую памятку оставлю, если есть пожелания, пишите, на статью тут как-то не ахти

-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе
- dikens3
- подполковник
- Сообщения: 4856
- Зарегистрирован: 2006-09-06 16:24:08
- Откуда: Нижний Новгород
- Контактная информация:
Re: Сортировка кириллцы в MySQL
1. По поводу раздела лучше спросить у Лиса, он скоро появится.zg писал(а):http://www.lissyara.su/?id=1655 держите статью, я только так и не понял, какой номер там ставить в родителе
2. В меню есть справка (нажми, там написаны номера разделов), я бы рекомендовал пока раздел 28 (28 - статьи -—> FreeBSD -—> Мелочи)
P.S. Доходчиво написано.
Код: Выделить всё
character_set_system - кодировка, в которой работает задаются идентификаторы MySQL, всегда UTF8
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.
-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
dikens3 писал(а):Ну и прогони через Word, ошибки есть.


- BlackCat
- прапорщик
- Сообщения: 469
- Зарегистрирован: 2007-10-16 22:40:42
Re: Сортировка кириллцы в MySQL
Хорошая статья получилась, может теперь реже будут кидаться делать "ALTER TABLE" при виде вопросиков, вместо данных
Особенно примеры порадовали 


-
- полковник
- Сообщения: 5845
- Зарегистрирован: 2007-12-07 13:51:33
- Откуда: Верх-Нейвинск
Re: Сортировка кириллцы в MySQL
ошибки подправлены, статья отправилась в раздел www, из того, что писал, сам много понял


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