Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Неверная кодировка и сортировка. cp1251 и utf-8 - Проблема хостеров или скрипта?
 
 автор: slamor   (04.12.2005 в 18:14)   письмо автору
 
 

Спасибо http://www.softtime.ru, что Вы есть.
Пришлось столкнуться с проблемой кодировки кирилицы.
Увидел, что люди тоже сталкиваются с вопросиками вместо русских букв.
Кодировку побороть получается, а вот с сортировкой пока проблемы. Помогите кто может.

Вот вся история:

Как пишет уважаемый cheops http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=8208
Это связано с тем, что у вас MySQL версии выше 4.1.0 - начиная с этой версии изменилась система кодировок

Вот, к примеру, NikVA писал
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=9884&page=2
http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=9609&page=1,
что получилось избавиться от вопросиков только перейдя на кодировку 'koi8r'. Но там неправильно указавна кодировка 'cpl1251' !!! Надо писать 'cp1251' .
И тоже может получиться.
Просто устанавливаемая кодировка при подключении должна соответствовать кодировке полей в базе. Если получилось с 'koi8r', значит в базе такая кодировка на полях.

Есть ещё одно средство. На одном из хостов мне помогла всего-лишь одна строчка после соединения с базой mysql_connect:


  mysql_query("SET NAMES cp1251");



И ещё одно. Убрать вопросики - это пол дела. На рабочем хосте, буквально недели две назад, хостеры перенесли всё на другой сервер, ну и естественно с более новыми программами с utf-8. Как результат в их phpadmin вместо русских букв появились иероглифы. Работать с phpmyadmin стало невозможно - сохранялись вопросики. При этом мой скрипт продолжал корректно работать с русским шрифтом в базе и на запись и на чтение.
А вот сортировка стала не правильной:

Васильев, Головко, Боднар, Высоцкая, Руденко, Ковтун, ...

ну явно не по-русски. Это естественно заметили также и наши заказчики ... Но у нас-то раньше скрипт работал правильно. Как быть?

Так вот. Кодировка базы и всех текстовых полей в таблицах стала Latin1_swedish_ci
(изначально я создавал базу и все текстовые поля с кодировкой cp1251_general_ci, а всё изменилось уже на рабочем сайте ~ 30000 наработанных записей в базе, после того как хостеры перенесли все сайты на другой сервер)

... Неделю мы общались с хостерами. Спустя неделю они установили у себя phpMyAdmin 2.6.4-pl2
MySQL 4.0.25-standard - остался как и был
- иероглифы в phpmyadmin исчезли - т.к. в пункте Language в phpmyadmin появился пункт 'Russian (ru-win1251)' - работает корректно только на нём.
Но сортировка так и осталась неверной.

В phpMyAdmin 2.6.4-pl2 исчезли поля с кодировками для базы и полей таблиц - узнать какая сейчас там кодировка - не знаю как :(((


SHOW CHARACTER SET

локально в Денвере срабатывает нормально, а на проблемном хосте выдаёт ошибку:

#1064 - You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'CHARACTER SET' at line 1 


команды:

mysql_query("SET NAMES cp1251");
mysql_query("set character_set_client='cp1251'"); 
mysql_query("set character_set_connection='cp1251'"); 
mysql_query("set character_set_database='cp1251'"); 
mysql_query("set character_set_results='cp1251'"); 
mysql_query("set character_set_server='cp1251'"); 
mysql_query("set collation_connection='cp1251_general_ci'"); 


не помогают. Замена на 'koi8r' - тоже - вопросиков-то уже нет. Всё работает даже без этих строк. Нет только правильной сортировки.

сторонний скрипт http://zapimir.net/skdumper/
(реально стоит того, что о нём говорят на http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=5257&page=2 для архивирования и восстановления больших баз - спасибо за ссылку и спасибо автору)

считывал базу всегда корректно с русскими буквами. Но кодировку при загрузке на локальную базу всегда ставил ту, что была в базе на хосте. Сначала он делал cp1251_general_ci, после вмешательств хостеров Latin1_swedish_ci.
Сейчес, когда хостеры были удалили базу и воссоздали её заново, а также сделали русские буквы в phpMyAdmin - при переносе базы с хоста в локаль скрипт создаёт базу и текстовые поля в utf8_general_ci.
Локально пользуюсь phpMyAdmin 2.6.1 - в нём доступны все необходимые кодировки.

Теперь я ни как не могу сделать сортировку на хосте правильной. Локально всё нормально.
Также не знаю как ещё можно узнать действительную кодировку полей в базе - phpMyAdmin 2.6.1 как-то же это показывал кодировки на полях. Кстати закачал его на хост, а там и у него эти поля исчезли.

Конечно будем ещё с хостерами разговаривать, но всё таки, чтоб меньше от них зависеть -
если кто знает какие-то команды, что влияют на сортировку - подскажите пожалуйста.

Заранее признателен.

Help, please.

   
 
 автор: cheops   (05.12.2005 в 02:42)   письмо автору
 
   для: slamor   (04.12.2005 в 18:14)
 

Т.е. сейчас у хостера стоит MySQL 4.0.25 и она не правильно сортирует русский текст? Я правильно понял? При этом при загрузки с этого хоста - текст в нём в кодировке cp1251?

PS Какой пост классный будем теперь на него ссылаться :)))

   
 
 автор: slamor   (05.12.2005 в 04:19)   письмо автору
 
   для: cheops   (05.12.2005 в 02:42)
 

Да правильно - на хосте cPanel показывает:
Версия MySQL 4.0.25-standard-log
Версия PHP 4.3.11
phpMyAdmin 2.6.4-pl2

И проблема - не правильно сортируется русский текст.

только вот текст в кодировке cp1251 в базе был изначально, когда я там базу создавал.
т.е. с 01.10.2005 сайт работал и сортировка работала отлично и сайт уже сдали заказчикам.
А после того как неделю назад хостеры удалили, а потом создали новую базу, восстановили данные и поставили phpMyAdmin 2.6.4-pl2 я уже не знаю какая там кодировка. Судя по тому, что сортировка не верная - точно уже не cp1251, т.к. с ней работало нормально.

Вот и прошу помощи - кто знает как узнать реальную кодировку текстовых полей в таблице?

Раньше-то я в phpMyAdmin смотрел - он при открытии структуры таблицы напротив каждого поля столбец "Сравнение" писал. Именно это значение непосредственно в поле на сортировку влияет. А теперь у хостеров нет такого столбца в phpMyAdmin. Более того, как я уже говорил выше, в закачаном на хост phpMyAdmin 2.6.1 он тоже исчезает.

Кстати cheops. Спасибо за ссылку http://drupal.kiev1.org/node/15
Сегодня (а вернее вчера) искал - не мог найти.
Именно там я когда-то команду mysql_query("SET NAMES cp1251"); нашёл.
Она отлично от вопросиков избавляет в новых phpMyAdmin, где есть только utf-8.

Там и про сортировку пишут - попробую завтра с
SELECT CONVERT(CONVERT(поле USING binary) USING кодировка) FROM таблица
на хосте поиграться. Может чего выясню.

Вот например хорошее отличие новых версий. Комманда:
SHOW FULL COLUMNS FROM vote_users

лосально выдаёт столбцы:
Field Type Collation Null Key Default Extra Privileges Comment

на хосте нет столбца Collation:
Field Type Null Key Default Extra Privileges

И как с этим бороться?
Кто чего знает про сортировку? Пожалуйста пишите - очень нужна помощь.

   
 
 автор: cheops   (05.12.2005 в 12:04)   письмо автору
 
   для: slamor   (05.12.2005 в 04:19)
 

Вы когда в phpMyAdmin заходите там на первой странице какая кодировка выбрана? В выпадающем списке Language - если cp1251 и при этом русский текст отображается нормально без кракозябликов - значит и в базе данных cp1251 - следует пинать хостеров, чтобы они в конфигурационном файле прописали что-то вроде
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/mysql/"

#Path to the database root
datadir="C:/mysql/Data/"

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=cp1251

Начиная с 4.0.25 там всё нормально должно быть...

   
 
 автор: slamor   (05.12.2005 в 12:32)   письмо автору
 
   для: cheops   (05.12.2005 в 12:04)
 

Да всё так на первой странице в пункте Language в phpmyadmin выбран пункт 'Russian (ru-win1251)' и только на нём phpmyadmin отображает корректно кирилицу - нет только сортировки. Спасибо будем уже более предметно с хостерами общаться. :)))

   
 
 автор: slamor   (06.12.2005 в 00:01)   письмо автору
 
   для: cheops   (05.12.2005 в 12:04)
 

Всё спасибо - пожар стих. Сортировка на сайте заработала нормально. Жаль правда не удалось добиться логического завершения - хостеры не устанавливали у себя:
default-character-set=cp1251
и в скрипте осталось не ясно как узнать действующую кодировку и сортировку.

В общем, не удивляйтесь, но у хостеров почему-то так ничего и не получилось и они вернули всё на старый сервер. Вот такие пироги.
Правда перед заказчиками подставляют нас: чего-то делают там - то вопросики появятся, то исчезнут, то пол вечера вообще домен отсутствует в инете. А у заказчиков-то сейчас самый пик пошёл - конкурс с голосованием в реальном времени организовали, две страны задействовали, а тут хостеры понимаешь, проблему устраняют. Слов не хватает.

Теперь там:
MySQL 4.0.25-standard-log
phpMyAdmin 2.6.3-pl1
PHP 4.3.11

Language в phpmyadmin выбран 'Russian (ru-win1251)' и только на нём phpmyadmin отображает корректно кирилицу. сортировка работает нормально.
наверно и правда в базе сейчас cp1251.
(только есть же cp1251_general_ci, cp1251_bulgarian_ci и др. - как теперь узнавать какая именно, а ведь тут и зарыта неверная сортировка и сравнения )
просто не нравится мне когда остаются не доконца осознанные вещи :)

SHOW FULL COLUMNS FROM table_name там также отсутствует столбец Collation
Field Type Null Key Default Extra Privileges

SHOW CHARACTER SET выдаёт ошибку - выше по тексту приведена.

В общем как в новых я даже не знаю чего: MySQL или phpMyAdmin - (у меня локально MySQL 4.1.8-max из поставки Денвера и есть столбец Collation) неизвесно как выяснить текущую и установить свою кодировку.

Раньше чего бы хостер не установил в настойках - всегда можно было выкрутиться:
создал базу. При ненастроеном MySql - Collation в latin1_swedish_ci будет установлено - ну и, что. Установил значение Collation например в cp1251_general_ci и нет проблем.
В крайнем случае mysql_query("SET NAMES cp1251"); написал, если в phpMyAdmin нет
ru-win1251, а только ru-utf-8 можа выбрать. И всё нормально.
Сейчас же выходит, что есть зависимости от хостера, а это значит, что данная история может повторяться и у других (надеюсь с более расторопными хостерами).

Если бы удалось узнать почему и когда пропадает Collation и какой тогда новый подход предлагается для сортировки (да. надо читать матчасть по нововведениям). Тогда можно было бы сделать заключение например, что если кирилица отображается верно, а сортировка нет, то это только в конфигурационном файле MySQL, а значит только у хостера.

Вот и вся история. cheops отдельное спасибо за помощь :)))

   
 
 автор: cheops   (06.12.2005 в 10:32)   письмо автору
 
   для: slamor   (06.12.2005 в 00:01)
 

Сортировка (Collation) и кодировка (Charset) для таблиц и столбцов присутствует только в MySQL начиная с версии 4.1, в 4.0 они выставляются глобально. Зря хостеры их не ставят - это сейчас стандарт де-факт, львиная доля Web-разработчиков работают в Windows... а хостеры в первую очередь по моему мнению должны беспокоится об удобстве разработчиков (они им услуги предоставляют), а не о собственной безопасности и удобстве эксплуатации сервера.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования