сортировка данных на русском при 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"
подскажите пожалуйста в чём может быть проблема и как её можно решить... а то сёдня полдня провозилась, весь инет перерыла....
Попробуйте, явно указывать вид сортировки:
ASC в восходящем порядке, DESC - в обратном.
P.S. На дату не посмотрел :) Год ушел на ответ, лучше поздно, чем никогда :)
Попробуйте, явно указывать вид сортировки:
ASC в восходящем порядке, DESC - в обратном.
P.S. На дату не посмотрел :) Год ушел на ответ, лучше поздно, чем никогда :)
да нет! вопрос очень даже актуален и был задан вчера, просто год почечему-то сбился... :)
а сортировать явно пробовала... всё то же самое :(
даже кодировку явно указывала, типа так:
select нужные_поля order by поле1 collate utf8_general_ci desc... та же проблема остаётся... выводит данные, но не в том порядке каком должно...
По поводу проблемы: по другим полям сортируется нормально? По числовым например?
У меня была похожая проблема: вроде все правильно а не сортирует... что сделал не помню :)
Приведите запрос как он есть, может в нем что-то не так?
версия myql 5
Угу, по другим всё хорошо... сортирует как надо...
select id, P1 from myTable order by P1 desc;
- в качестве клиента у меня был MySQL-Front 5.0 база, таблица и строка были в UTF-8, при этом после ввода все данные становились "иероглифами", сортировка не работала (я по id смотрел, потому что строки нечитабельны стали) отсюда вывод, что скорее всего запросы были не в UTF.
- потом я зашел через phpMyAdmin, удалил все строки с иероглифами, добавил новые - все заработало.
Что Вы используется для доступа к MySQL? Возможно дело в том, что запрос не в той кодировки?
я через консольку работаю...
Правда непонятно почему тогда они все-таки нормально возвращаются? у меня они возвращаются "козябликами" :)
Может благодаря "set names utf8", "collate" и т.д.?
и добавить данные на русском уже низя...
если сет нэймс не писать, а при сортировке в конце дописывать collate utf8_general_ci, сортировка всё равно остаётся неверной...
в любом случае, GreenRiver, огромное вам спасибо что стараетесь помочь!:)
в общем так, всего-то навсего нужно писать следующее:
select sort_field from tableName ORDER BY binary(sort_field)
Проблема явно в кодировке ... использовать binary(...), чтобы сравнивать побайтно было красивой идей, жаль что не сработала.
В любом случае проблема возникает только при работе из командной строки?? Нужно сменить кодировку запросов.
Добавлю... сортировка не работает не только из командной строки... но и при запросах посредством PHP.
Добавлю... сортировка не работает не только из командной строки... но и при запросах посредством PHP.
Я когда кодил в PHP всегда использовал cp1251... поэтому с такой проблемой не сталкивался. Вот такая идея в голову пришла: сам PHP скрипт сделать в UTF-8 (не знаю даже что из этого получится, но попробовать стоит... главное чтобы данные в базу добавлялись именно из такого скрипта)
Хм... а что его делать то?
Вот:
$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);
?>
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... у меня ощущение, что меня не понимают :)
mysql_query("set collation_connection=utf8;");
хотя ты прав надо так:
mysql_query("set collation_connection=utf8_general_ci;");
и как я это не заметил... хм.. чет не внимателен становлюсь(
Добавлено позже:
хм... проверил что-то не катит... хотя отдельным скриптом катит... видимо у мну в CMS где-то ошибка... буду искать...
ЗЫ: Старею)
Добавлено позже:
хм... проверил что-то не катит... хотя отдельным скриптом катит... видимо у мну в CMS где-то ошибка...
Скорее всего в CMS есть файлы не в UFT-8, а в ANSI... Или может быть база уже содержит какие-то данные?! Желательно очистить и по-новой из исправленных скриптов заполнить.