PHP и Mysql и Сортировка русских фамилий
11 Января 2025, 06:23:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: ВНИМАНИЕ Почта на домене 2126.ru прекращает свою работу
   Начало   Главная Поиск Правила Камасутра Блоги Чат (1) Галерея Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: PHP и Mysql и Сортировка русских фамилий  (Прочитано 928 раз)
0 Пользователей и 1 Гость смотрят эту тему.
shandai ТС
Ветеран форума
******

Карма +452/-1
Offline Offline

Пол: Мужской
Сообщений: 1334

город Хабаровск

Пешеход

« : 11 Ноября 2008, 12:22:42 »

Есть: Apacheб, Mysql 5.0, W2003, PHP -все работает.
Проблема в следующем, все данные в базу вносились на русском языке через ВЕБ, при выводе order by fam сортировка происходит но кривая, буква Д перед Ш и т.д.
Почитал кучу форумов, пробовал много не помогает.
1. Менял кодировку my.inf на все что можно, соотвтественно добавлял уже с новой кодировкой в базу из Web результат 0, все как криво выводилось так и выводиться., если добавлять из коммандной строки то запись в коммандной строке будет по русски, все остальные добавленные из веб формы на албанском, а в ВЕБ форме при помсмотре все что добавленно из коммандной с троки на албанском.
2. Что делать, что бы сортировка выводилась грамотно.
Записан

Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
OVA
Moдератор

*****

Карма +1551/-118
Offline Offline

Пол: Мужской
Сообщений: 14739

Тула + д. Ревякино


Нормозавр 21261-070 (был). Нынче Фабула.

WWW

Тула + д. Ревякино
ИЖ 21261-030
« Ответ #1 : 11 Ноября 2008, 12:58:43 »

Обычно есть кодовая страница базы и есть кодовая страница клиента. Первая определяется при разработке базы, вторая задается при соединении клиента с сервером в параметрах подключения. У тебя явное несоответствие одного другому. Еще кодовая страница столбца может быть задана и порядок сортировки (collate order) данных этого столбца. Однако, этими мерами ты уже введенные "криво" данные в базе не исправишь. Но навести порядок при добавлении новых сможешь.
« Последнее редактирование: 11 Ноября 2008, 13:02:43 от OVA » Записан

P.S. Василий.  Еще один из беглых ижевчан.
---
(ОКПП, ГБО, ЭСП), поборол электричество, "бустера" дворников нет
SergeiSS
Гость
« Ответ #2 : 11 Ноября 2008, 13:12:02 »

Я когда в начале года начал заниматься ПХП (по работе надо было), то сначала набил много шишек с MySQL, а потом по совету Парамедика выбрал PostgreSQL. С тех пор у меня "почему-то" Smile нет проблем ни с кодировками, ни с чем-то другим... Просто использую БД и всё. И до сих пор не жалею, особенно когда читаю (постоянно) про проблемы с MySQL.

Это не реклама была Smile

А вообще, стандартный вопрос в такой ситуации "Покажи код, которым к базе коннектишься".
Второй возможный ответ "Зайди на специализированный форум", т.е. больше спецов. Например, http://www.phpforum.ru/.

Однако, этими мерами ты уже введенные "криво" данные в базе не исправишь. Но навести порядок при добавлении новых сможешь.
Есть в ПХП какие-то функции перекодировки, но я ими не пользовался (не было необходимости). Я думаю, что с их помощью можно будет порядок навести и в старых данных. Но голову поломать придется с тем, как это сделать.
« Последнее редактирование: 11 Ноября 2008, 13:13:57 от SergeiSS » Записан
glory
Гость
« Ответ #3 : 11 Ноября 2008, 14:06:12 »

Вероятнее всего несоответствие charset-а таблицы/столбца, charset-у реально загруженных данных. Коллашен обычно указывать смысла нет (разве что только для некоторых специфических видов задач) и мускул сам подпирает подходящий для выбранного charset.
Поправить данные в базе возможно, но несколько геморно:  выяснить в каком реальном наборе символов записаны данные в таблицу, mysqldump в файл, поправить дамп, чтобы кодировка данных совпадала с кодировкой указанной для таблиц, возможно придется воспользоваться каким-либо конвертором кодировок для трансляции данных, перезалить.
В дальнейшем, во избежание проблем, из PHP кода надо выполнять директиву-запрос "SET NAMES <charset> ..." отражающую в каком наборе символов подаются данные со стороны клиента. Этот <charset> обязан коррелировать со значением атрибута тега
<META http-equiv="Content-Type" content="text/html; charset=xxxxx" />, в противном случае возможно, что со страницы данные пойдут в, например, UTF, а в базу зальются как win1251.

PS: и долой перекодирующий апач, раньше он Russian Apache назывался, для интерактивных приложений он плохо подходит, поскольку хрен поймешь в каком же наборе символов PHP скрипту данные подаются.
« Последнее редактирование: 11 Ноября 2008, 14:11:29 от glory » Записан
OVA
Moдератор

*****

Карма +1551/-118
Offline Offline

Пол: Мужской
Сообщений: 14739

Тула + д. Ревякино


Нормозавр 21261-070 (был). Нынче Фабула.

WWW

Тула + д. Ревякино
ИЖ 21261-030
« Ответ #4 : 11 Ноября 2008, 14:06:21 »

Вот именно это я и имел в виду, что "автоматически" навести порядок не выйдет. Данные записаны УЖЕ в разных кодировках, и отделять зерна от плевел будет ой как непросто.
А каким движком баз данных пользоваться-это вопрос постановки задачи. Выбран "мускул"- право личное каждого. Не забывать только что для коммерческого использования он платный! Преимущества серверов SQL друг перед другом-это ж айтишный ВАЗ-УЗАМ Smile
Записан

P.S. Василий.  Еще один из беглых ижевчан.
---
(ОКПП, ГБО, ЭСП), поборол электричество, "бустера" дворников нет
shandai ТС
Ветеран форума
******

Карма +452/-1
Offline Offline

Пол: Мужской
Сообщений: 1334

город Хабаровск

Пешеход

« Ответ #5 : 11 Ноября 2008, 14:42:10 »

Вот собственно код
******************************************************
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
$db = new mysqli ('localhost','','','satit');
       if (mysqli_connect_errno()) {echo 'Nevozmogno podkluchitsa k baze'; exit;}
       echo 'Список всех инженеров...</br>';
///////////////////////////////////////////////////////////////////////////////
$query = "select * from ING order by fam";
$result = $db->query($query);
$num_results = $result->num_rows;
echo 'В базе '.$num_results.' инженеров </br>';
for ($i=0; $i <$num_results; $i++)
  { $row = $result->fetch_row(); echo $row;  }
********************************************************************************
Соответсвенно в этой же кодировке и добавляю в базу. Кодировку в my.ini менял, на такую же данные все перезаписывал. Без результата.
1. Либо они вносятся в совершенно другой кодировке (как это зачечь я я так и не понял)
2. На php там во сновном про линукс, и все от туда я попробовал, и уловил следующую мысль: что мускул не правильно сартирует, потому как сортирует относительно своей логики и указанного типа данных например w1251.
3. Я в my.ini меняю кодировку на нужную, данные получаю в ВЕб нормальные и перезаписываю их, но они потом все равно не сортируются.

Записан

Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
Elrie
Живёт здесь
*****

Карма +444/-0
Offline Offline

Пол: Мужской
Сообщений: 591

Воронеж

Opel Astra H 1.8, белый

WWW

Воронеж
Opel Astra H 1.8
« Ответ #6 : 11 Ноября 2008, 14:45:21 »

PS: и долой перекодирующий апач, раньше он Russian Apache назывался, для интерактивных приложений он плохо подходит, поскольку хрен поймешь в каком же наборе символов PHP скрипту данные подаются.

А вот это автор темы все же проверил?
Ибо очень важный совет, иначе постоянные проблемы будут с кодировками.
Записан

верно служил прежде ИЖ-2126-020 / 2003 г / дипломат
shandai ТС
Ветеран форума
******

Карма +452/-1
Offline Offline

Пол: Мужской
Сообщений: 1334

город Хабаровск

Пешеход

« Ответ #7 : 11 Ноября 2008, 15:13:42 »

А вот это автор темы все же проверил?
Ибо очень важный совет, иначе постоянные проблемы будут с кодировками.
По идее у меня не должен быть перекодирующий апач, а как это проверить? Да и это не причем. Так как данные вносятся в какой кодировке не понятно, но суть что они в этой кодировке но сортируются.
Записан

Пешеход /Был: ЗАЗ-Lanos 1.6L 109 л.с. / Был: Иж 2126 гранат 2003г, УМПО, кастрюля, КПП ОМСК, стартер от ГАЗ 53, БК-21, звуковой сигнал от ГАЗ 3110, карб (солекс) ДААЗ-21073, свечи всегда "Чемпион", NGK-плохие, укороченная ручка КПП, БСЗ, подогрев заднего стекла и правого седенья, чехлы, тонировка задка, сцепа и диск totti, выжимной Coram, резина cordiant на штамповке РР от волги (все равно не помогает), перемычка АКБ-Стартер (тоже не помогла).
glory
Гость
« Ответ #8 : 11 Ноября 2008, 15:25:53 »

PHP-ой будут сортироваться, средствами сервера базы данных - нет, из-за несоответсвия фактической кодировки данных установленному для таблицы order collation.

Цитировать
3. Я в my.ini меняю кодировку на нужную, данные получаю в ВЕб нормальные и перезаписываю их, но они потом все равно не сортируются.
не поможет ибо таблицы "чинить" надо

А в коде, данные скорее всего передаются в win1251, т.к. явно указан чарсет страницы, но поскольку явно SET NAMES не указано, то вся ботва, а именно character_set_client и character_set_connection, наследуется от настроек сервера и совсем не факт, что первый будет тоже win1251

Добавь в код выполнение запроса
Код:
show variables like 'char%'
и посмотри на результат - будет видно с какими параметрами установлено текущее подключение к базе.
« Последнее редактирование: 11 Ноября 2008, 15:33:01 от glory » Записан
SergeiSS
Гость
« Ответ #9 : 11 Ноября 2008, 16:16:11 »

Я тут посмотрел хэлп - есть целая группа функций для работы с кодировками строк. Начинаются функции с букв "mb_......", вместо многоточия - имя функции.
Одна из них
Цитировать
mb_convert_encoding — Convert character encoding

Описание
string mb_convert_encoding ( string $str, string $to_encoding [, mixed $from_encoding] )

Converts the character encoding of string str to to_encoding from optionally from_encoding.
Вроде как, с помощью этих функций можно будет перекодировать содержимое БД, которое уже было неправильно закодировано. Т.е. просто выгрузить данные, перекодировать и проапдейтить.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines

Яндекс.Метрика

Google последней посетил эту страницу 03 Октября 2024, 06:08:16