Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

сортировка данных на русском при utf8...

14K
13 ноября 2008 года
Irene_001
43 / / 29.07.2007
дело вот в чём. при установке mySql кодировку выставила utf8. При создании иаблицы кодировку тоже выставляла utf8:
create table TableName (... ) default character set utf8.

теперь при внесении данных в свою табличку на русском, данные читаются и записываются нормально, но не работает сортировка. то есть сортировка работает, но выборочно: что-то сортирует, что-то нет.
сортирую так:
select нужные поля from TableName order by поле1 collation utf8_general_ci

пробовала вводить след строку set names utf8(или строку set character set utf8, что, как я понимаю, равносильно)... меняла collation на utf8_general_ci... но после перечисленных настроек данные вообще выводятся непонятным шрифтом, и добавить(или изменить) данные на русском языке не возможно: выдаётся "ERROR 1366 (HY000): incorrect string value: '\xA1\xE0\xA0\xAC-\xA1...' for column for column 'Title' at row 1"
подскажите пожалуйста в чём может быть проблема и как её можно решить... а то сёдня полдня провозилась, весь инет перерыла....
1.9K
13 ноября 2008 года
GreenRiver
451 / / 20.07.2008
У меня была похожая проблема на MSSQL 2005.
Попробуйте, явно указывать вид сортировки:
ASC в восходящем порядке, DESC - в обратном.
 
Код:
select нужные поля from TableName order by поле1 DESC

P.S. На дату не посмотрел :) Год ушел на ответ, лучше поздно, чем никогда :)
14K
13 ноября 2008 года
Irene_001
43 / / 29.07.2007
Цитата: GreenRiver
У меня была похожая проблема на MSSQL 2005.
Попробуйте, явно указывать вид сортировки:
ASC в восходящем порядке, DESC - в обратном.
 
Код:
select нужные поля from TableName order by поле1 DESC

P.S. На дату не посмотрел :) Год ушел на ответ, лучше поздно, чем никогда :)



да нет! вопрос очень даже актуален и был задан вчера, просто год почечему-то сбился... :)
а сортировать явно пробовала... всё то же самое :(
даже кодировку явно указывала, типа так:
select нужные_поля order by поле1 collate utf8_general_ci desc... та же проблема остаётся... выводит данные, но не в том порядке каком должно...

1.9K
14 ноября 2008 года
GreenRiver
451 / / 20.07.2008
С годом это я не туда посмотрел :)
По поводу проблемы: по другим полям сортируется нормально? По числовым например?
У меня была похожая проблема: вроде все правильно а не сортирует... что сделал не помню :)
Приведите запрос как он есть, может в нем что-то не так?
14
14 ноября 2008 года
Phodopus
3.3K / / 19.06.2008
Какая версия MySQL?
14K
14 ноября 2008 года
Irene_001
43 / / 29.07.2007
Цитата: Phodopus
Какая версия MySQL?


версия myql 5

Цитата: GreenRiver
По поводу проблемы: по другим полям сортируется нормально?


Угу, по другим всё хорошо... сортирует как надо...

Цитата: GreenRiver
Приведите запрос как он есть


select id, P1 from myTable order by P1 desc;

1.9K
15 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Кажется удалось воспроизвести ситуацию:
  1. в качестве клиента у меня был MySQL-Front 5.0 база, таблица и строка были в UTF-8, при этом после ввода все данные становились "иероглифами", сортировка не работала (я по id смотрел, потому что строки нечитабельны стали) отсюда вывод, что скорее всего запросы были не в UTF.
  2. потом я зашел через phpMyAdmin, удалил все строки с иероглифами, добавил новые - все заработало.
Что Вы используется для доступа к MySQL? Возможно дело в том, что запрос не в той кодировки?
14K
15 ноября 2008 года
Irene_001
43 / / 29.07.2007
Цитата: GreenRiver

Что Вы используется для доступа к MySQL? Возможно дело в том, что запрос не в той кодировки?



я через консольку работаю...

1.9K
15 ноября 2008 года
GreenRiver
451 / / 20.07.2008
В общем, у меня подозрение, что данные добавленные в базу представляют собой строки в какой-то другой кодировке, MySQL при сортировки считывает их как UTF (поэтому они криво сортируются).
Правда непонятно почему тогда они все-таки нормально возвращаются? у меня они возвращаются "козябликами" :)
Может благодаря "set names utf8", "collate" и т.д.?
14K
15 ноября 2008 года
Irene_001
43 / / 29.07.2007
угу... если в mysql прописывать set names utf8, то возвращаются "козябликами" :)
и добавить данные на русском уже низя...
если сет нэймс не писать, а при сортировке в конце дописывать collate utf8_general_ci, сортировка всё равно остаётся неверной...
в любом случае, GreenRiver, огромное вам спасибо что стараетесь помочь!:)
14K
15 ноября 2008 года
Irene_001
43 / / 29.07.2007
УРА! нашла ответ! :)
в общем так, всего-то навсего нужно писать следующее:
select sort_field from tableName ORDER BY binary(sort_field)
1.9K
15 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Изящно :)
44K
28 ноября 2008 года
devote
8 / / 28.11.2008
ничего не работает, вы пробывали сортировать текст когда он по несколько слов в строке, сорт работает по первому слову... последущие слова в строке отсортированы как попало... а точнее вообще не сортируются
1.9K
29 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Цитата: devote
ничего не работает, вы пробывали сортировать текст когда он по несколько слов в строке, сорт работает по первому слову... последущие слова в строке отсортированы как попало... а точнее вообще не сортируются


Проблема явно в кодировке ... использовать binary(...), чтобы сравнивать побайтно было красивой идей, жаль что не сработала.
В любом случае проблема возникает только при работе из командной строки?? Нужно сменить кодировку запросов.

44K
29 ноября 2008 года
devote
8 / / 28.11.2008
binary сравнивает по коду байтов, и соответственно по количеству байт в строке, или даже правильнее сказать в буфере, ведь в бинарном режиме это для него просто как данные в байтах... посему и сортировка работает не так... Я сам мучаюсь с этим давно... и ничего сделать не могу... уж все что можно перепробывал... остается делать сортировку через скрипт, я заметил что в PHP функция sort сортирует замечательно текст в UTF-8 кодировке, уж кирилические точняк нормально, латиницу не проверял по ненадобности, ее все умеют сортировать... А вот как сортировать не одномерные массивы а такие как выдает SQL вот с этим проблемма... Придется писать функцию для сортировки, что заметно снизит скорость открытия сайта, особенно если не сотни а тысячи строк обработать надо..


Добавлю... сортировка не работает не только из командной строки... но и при запросах посредством PHP.
1.9K
29 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Цитата: devote

Добавлю... сортировка не работает не только из командной строки... но и при запросах посредством PHP.


Я когда кодил в PHP всегда использовал cp1251... поэтому с такой проблемой не сталкивался. Вот такая идея в голову пришла: сам PHP скрипт сделать в UTF-8 (не знаю даже что из этого получится, но попробовать стоит... главное чтобы данные в базу добавлялись именно из такого скрипта)

44K
30 ноября 2008 года
devote
8 / / 28.11.2008
Цитата: GreenRiver
Я когда кодил в PHP всегда использовал cp1251... поэтому с такой проблемой не сталкивался. Вот такая идея в голову пришла: сам PHP скрипт сделать в UTF-8 (не знаю даже что из этого получится, но попробовать стоит... главное чтобы данные в базу добавлялись именно из такого скрипта)



Хм... а что его делать то?

Вот:

Код:
<?php

$db_id = mysql_connect('localhost', 'root', '');
mysql_select_db('my_data_base');

mysql_query("set session character_set_client=utf8;");
mysql_query("set session character_set_database=utf8;");
mysql_query("set session character_set_connection=utf8;");
mysql_query("set session character_set_results=utf8;");
mysql_query("set session collation_connection=utf8;");

$sql = "CREATE TABLE IF NOT EXISTS `my_table` (
      `id` int(11) UNSIGNED NOT NULL auto_increment,
      `name` varchar(250) NOT NULL default '',
      PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;"
;

mysql_query($sql, $db_id) or die('err');

// забиваем таблицу
$sql = "INSERT INTO `my_table` (name) VALUES ('Test text');";
mysql_query($sql, $db_id) or die('err');
// и так далее забиваем таблицу

$sql = "SELECT * FROM `my_table` ORDER BY name DESC;";
$result = mysql_query($sql, $db_id) or die('err');

$rows = mysql_num_rows($result);
$data = array();
for ($i=0; $i<$rows; $i++){
    $data[] = mysql_fetch_assoc($result);
}
mysql_free_result($result);

mysql_close($db_id);

//Тут выводим полученное

print_r($data);


?>
1.9K
30 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Код:
<?php

mysql_connect('localhost', 'root', '');
mysql_select_db('test');

mysql_query("set character_set_client=utf8");
mysql_query("set character_set_database=utf8");
mysql_query("set character_set_connection=utf8");
mysql_query("set character_set_results=utf8");
mysql_query("set collation_connection=utf8_general_ci");


mysql_query("CREATE TABLE IF NOT EXISTS `my_table` (
      `id` int(11) UNSIGNED NOT NULL auto_increment,
      `name` varchar(250) NOT NULL default '',
      PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8"
);


mysql_query("INSERT INTO my_table (name) VALUES ('арбуз')");
mysql_query("INSERT INTO my_table (name) VALUES ('абрикос зеленый')");
mysql_query("INSERT INTO my_table (name) VALUES ('яблоко')");
mysql_query("INSERT INTO my_table (name) VALUES ('абрикос спелый')");

$res = mysql_query("SELECT * FROM my_table ORDER BY name DESC");

while ($r = mysql_fetch_array($res))
{
    print "$r[name]<br>";
}
?>

У меня все работает ... сам скрипт в UTF-8, кодировка возвращаемой страницы соответственно тоже. Результат:
 
Код:
яблоко
арбуз
абрикос спелый
абрикос зеленый

P.S. "сам скрипт в UTF-8" означает, что сам файл должен быть в UTF-8... у меня ощущение, что меня не понимают :)
44K
30 ноября 2008 года
devote
8 / / 28.11.2008
Хм... интерестно, как ты занес данные в мускул не конвертнув их в UTF8 у мну дык просто не проходит ничего, пустые строки в БД появляются
44K
30 ноября 2008 года
devote
8 / / 28.11.2008
собстно ошибка моя только в этом:
mysql_query("set collation_connection=utf8;");

хотя ты прав надо так:

mysql_query("set collation_connection=utf8_general_ci;");

и как я это не заметил... хм.. чет не внимателен становлюсь(

Добавлено позже:
хм... проверил что-то не катит... хотя отдельным скриптом катит... видимо у мну в CMS где-то ошибка... буду искать...

ЗЫ: Старею)
1.9K
30 ноября 2008 года
GreenRiver
451 / / 20.07.2008
Цитата: devote

Добавлено позже:
хм... проверил что-то не катит... хотя отдельным скриптом катит... видимо у мну в CMS где-то ошибка...


Скорее всего в CMS есть файлы не в UFT-8, а в ANSI... Или может быть база уже содержит какие-то данные?! Желательно очистить и по-новой из исправленных скриптов заполнить.

44K
30 ноября 2008 года
devote
8 / / 28.11.2008
Да все норм, файлов в ANSI точно нет... вроде не до такой степени туплю... CMS встраивал во многие сайты, это сайт недавно сделал, да вот что-то сортировка не работает, не понимаю... данные все в UTF-8 залиты в базу, да и перезаливать слишком много и не мое.. владельцы ругатся будут... это просто где-то в торопях я ошибку сделал, вот и буду теперь с ней боротся, это все мой начальник, торопит без конца, а в торопях чё тока не на портишь, сайт за 3 дня написать пришлось, вот и ошибся где-то....
44K
30 ноября 2008 года
devote
8 / / 28.11.2008
Хм... локально нормально пашет... это чет на сервере не фурычит... перенес сайт на локаль и базу тоже... сорт фурычит... надо мускул настраивать... видимо в нем трабла
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог