За последние 24 часа нас посетили 18373 программиста и 1605 роботов. Сейчас ищут 938 программистов ...

Помогите пожалуйста, проблема с кодировкой в MySql

Тема в разделе "PHP для новичков", создана пользователем beki007, 29 дек 2011.

  1. beki007

    beki007 Активный пользователь

    С нами с:
    25 дек 2011
    Сообщения:
    25
    Симпатии:
    0
    Помогите пожалуйста, проблема с кодировкой в MySql,
    Я вот создал сайт, на денвере, кодировку установил utf-8
    но когда перенес сайт на сервер, там все некорректно отображается, ????????????? такие вопросики выводит вместе текста, и тогда я вручную переписал инфу в бд, вместе вопросиков (?????????) выводит квадратики (���������),
    И еще непереносит слово, все в одной строке выводится, например тект в контейнере <div>Здесь указан путь к бд</div>
    К контейнеру в css задан резмер 735px, но оно не принимает, и выводится в одной строке по горизонтали
    помогите пожалуйста решать проблему,
    заранее благодарен,,,
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Переведите html файлы в UTF-8 (без BOOM), думаю, что возникнет вопрос как это сделать.
    Так, что отвечу сразу например Notepad++
    в <meta /> теге так же указать utf-8
    Также и базу (таблицы и поля) переведите в utf-8, если не переведено.
     
  3. beki007

    beki007 Активный пользователь

    С нами с:
    25 дек 2011
    Сообщения:
    25
    Симпатии:
    0
    А как перевести базу (таблицы и поля) на utf-8, Проблема осталось токо в базе
     
  4. Denis_PHP

    Denis_PHP Активный пользователь

    С нами с:
    28 дек 2011
    Сообщения:
    11
    Симпатии:
    0
    когда создаешь базу и таблицы в phpmyadmin есть такой пункт как сравнение или что-то в этом роде.в списке ты должен выбрать utf-8 general
     
  5. Ratenn

    Ratenn Активный пользователь

    С нами с:
    30 дек 2011
    Сообщения:
    3
    Симпатии:
    0
    В вопросах кодировки в БД utf-8 или windows-1251 многие для себя до конца и не определились. В windows-1251 и размер строки в таблице меньше и сортировка быстрее. Причем сами php скрипты и html или xml вывод у тебя могут быть в utf-8, а в БД строки могут храниться в windows-1251. Просто это требует некоторых плясок с бубном, о которых дальше расскажу.
    С utf-8 есть нюансик. В php строки хранятся в мультибайте в кодировке utf-8. mb_detect_encoding() возвращает "utf-8". НО, если вызвать mb_convert_encoding($str, 'windows-1251') (т.е. преобразовать из текущей кодировки в windows-1251) и mb_convert_encoding($str, 'windows-1251', 'utf-8') (т.е. преобразовать именно из utf-8 в windows-1251) получаются РАЗНЫЕ строки. И не только у меня. В нете много жалоб на глюки с utf-8 в php5 с mysql именно с кириллицей.
     
  6. Ratenn

    Ratenn Активный пользователь

    С нами с:
    30 дек 2011
    Сообщения:
    3
    Симпатии:
    0
    О плясках с бубном, или как я использую windows-1251 в БД при utf-8 в скриптах.
    1. Таблицы и поля в БД создаешь со сравнением cp1251_general_ci.
    2. При подключении к БД первым запросом выполняешь следующий
    mysql_query('set names cp1251', $DBLink);
    Это установит кодировку по умолчанию для сервера mysql в windows-1251. Это обязательно.
    3. Строки, которые записываешь в БД и которые содержат кириллицу преобразуешь следующим образом
    mb_convert_encoding($str, 'windows-1251', 'utf-8').
    4. Строки, которые считываешь из БД и которые содержат кириллицу преобразуешь следующим образом
    mb_convert_encoding($str, 'utf-8', 'windows-1251').
    Если строка гарантированно содержит только первые 128 символов ascii-таблицы (латиница, цифры, знаки) - преобразование смело можешь не делать.
    У меня все работает.
     
  7. Ratenn

    Ratenn Активный пользователь

    С нами с:
    30 дек 2011
    Сообщения:
    3
    Симпатии:
    0
    Надеюсь, "ухаживание" было достаточным ;))
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ratenn
    Всё будет нормально работать и без плясок. Просто сразу после подключения к серверу б.д. пишется:

    mysql_query('SET NAMES utf8');

    MySQL сам знает, в какой кодировке у него хранятся данные в таблицах. Ты же сам при создании таблиц указывал cp1251. Запросом SET NAMES ты указываешь серверу, в какой кодировке работает клиент (то есть PHP-скрипт твой) - в какой кодировке он отправляет данные в MySQL и в какой кодировке хочет получать данные от MySQL. Этого достаточно. MySQL сам автоматически будет переконвертировать данные из одной кодировки в другую, если кодировка таблиц отличается от той, которая указана в SET NAMES.
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    А вот у beki007 проблема несколько иная. У неё такая ситуация, что какой запрос SET NAMES не напиши - всё будут квадратики и вопросики. Просто изначально данные в б.д. внеслись с ошибкой и MySQL в этом случае не то, чтобы не знает кодировку данных, но знает не правильно...
    Полагаю, если написать SET NAMES latin1 (или не писать вообще), а потом средствами PHP переконвертировать из Windows-1251 в UTF-8 (как в твоём примере) - это должно сработать.

    Скорее всего, у beki007 кодировка таблиц и самой б.д. - latin1 (стандартная кодировка MySQL, которая по-умолчанию ставится при установке, то бишь Windows-1250). Но при записи данных в эту таблицу - PHP отправлял данные в кодировке cp1251. При этом MySQL не знал, что эти данные в cp1251, он думал, что там cp1250, потому что явного указания, в какой именно кодировке приходят данные - не было (т.е. не было запроса SET NAMES). MySQL, по сути, просто пихал поток байт "как есть" в таблицу - и всё. Получилась такая хрень, что MySQL уверен, что данные, которые записаны в таблицу, в кодировке latin1, однако на самом деле - там cp1251. А теперь мы ставим запрос SET NAMES utf8 и пробуем эти данные получить. MySQL получил команду отдавать данные в кодировке utf8 и он уверен, что в таблице данные в кодировке latin1. При выдаче данных он будет перекодировать из кодировки latin1 в кодировку utf8 данные, которые реально находятся в кодировке cp1251. Естественно, ничего путного из этого не выйдет.

    Чтобы исправить ситуацию с б.д., можно написать PHP-скрипт, который будет сперва считывать таблицы, не указывая SET NAMES, а потом пошлёт запрос SET NAMES, создаст новые таблицы и вставит в них данные уже в нужной кодировке.
     
  10. beki007

    beki007 Активный пользователь

    С нами с:
    25 дек 2011
    Сообщения:
    25
    Симпатии:
    0
    Спасибо всем, тем который хотел помогать,
    Да думаю sobachnik прав, потомущо я пробовал все методы, но все таки не сработало, вот поэтому мне надо снова пересоздать базу, поскольку я еще не умею написать такой php скрипт. Спасибо всем
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Что за бред, какие ты скрипты собрался писать? :))

    Ему базу и таблицы с колонками перевести надо, а он скрипты писать пошел)))


    Заходишь в phpMyAdmin:
    Нажимаешь на базу -> Операции -> Сравнение (выбираешь utf8_general_ci) жмешь ок. База теперь utf8
    Далее жмешь на таблицу в базе -> Операции -> Сравнение (выбираешь utf8_general_ci) жмешь ок. Таблица теперь utf8
    Теперь открываешь таблицу и выделяешь все столбцы и жмешь редактировать -> Сравнение (выбираешь utf8_general_ci) там где не utf8 и все жмешь ок. Теперь и База и таблицы и столбцы с таблицах имеют кодировку utf8, после всего этого переводишь файлы на utf-8 и после соединения с базой указываешь utf8 все теперь радуешься.