За последние 24 часа нас посетили 20912 программистов и 1107 роботов. Сейчас ищут 422 программиста ...

Проблема с кодировкой. Вместо русских букв кракозябры.

Тема в разделе "MySQL", создана пользователем Sergey89, 30 янв 2008.

  1. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Данная "проблема" ждёт пользователей MySQL версии 4.1 и выше, которые никогда не пытались читать документацию.

    Первым делом нужно проверить, что установлено нужное сопоставление (collation) для текстовых полей в таблице. Именно в установленной кодировке хранятся данные. Если для полей выставлена "неправильная" кодировка, то измените её. В phpMyAdmin это можно сделать при редактировании столбца таблицы, выбрав нужное значение из списка Сравнений. Для русский символов это может быть, например, cp1251_general_ci (основная регистронезависимая cp1251). Для UTF-8 - utf8_general_ci.

    Теперь нужно выставить кодировку соединения с сервером. В MySQL есть выражение SET NAMES, предназначенное специально для этого:
    [sql]SET NAMES 'cp1251';[/sql]
    Выполнить данный запрос нужно сразу после подключения к серверу.
    PHP:
    1. <?php
    2. mysql_connect('server','user', 'pasw') or die('Connection error.');
    3. mysql_query("SET NAMES 'cp1251'");
    После этого все данные будут приходить в установленной кодировке. Кодировку соединения можно менять:
    [sql]SET NAMES 'utf8';[/sql]
    В этом случае данные будут приходить в UTF-8, никак не затрагивая данные в таблице, которые могут храниться в другой кодировке. Следите за тем, чтобы весь остальной текст на странице тоже был в UTF-8.

    Вопросы? Замечания?
     
  2. M@rko

    M@rko Активный пользователь

    С нами с:
    21 янв 2008
    Сообщения:
    5
    Симпатии:
    0
    пробовал.
    все равно ведает кроказяблы! хоть и другие...
     
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Предлагаешь мне погадать? В какой кодировке таблица, в какой кодировке страница? Юзер рутовый или нет?
     
  4. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Добавлю к сообщения Сергея:
    Сегодня была фигня, что русский текст показывался корректно (utf8 и в БД и на странице), но буквы "ш" и "И" показываются в виде квадратиков (в IE) и другими крякозябрами в других браузерах. Погуглив, решил проблему так:

    На БД и таблицы установил utf8_general_ci
    После коннекта к БД:
    [sql]
    mysql_query("SET NAMES 'utf8';");
    mysql_query("SET CHARACTER SET 'utf8';");
    mysql_query("SET SESSION collation_connection = 'utf8_general_ci';");
    [/sql]

    И все нормально работает.
     
  5. tmanager

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

    С нами с:
    12 мар 2008
    Сообщения:
    108
    Симпатии:
    0
    Стоит добавить, как поддержка кодировки уcтанавливается на MySQL под Windows

    Пример конфигурационного файла my.ini

    [client]
    port = 3306

    #Конфигурационные параметры для сервера MySQL
    [mysqld]
    port = 3306
    socket = /tmp/mysql.sock
    skip-locking
    key_buffer = 16K
    max_allowed_packet = 1M
    table_cache = 4
    sort_buffer_size = 64K
    read_buffer_size = 256K
    read_rnd_buffer_size = 256K
    net_buffer_length = 2K
    thread_stack = 64K
    # Установка кириллицы на сервере
    default-character-set=cp1251 #Указание кодировки
    character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!)

    server-id = 1

    # Конфигурационные параметры для программы резервного копирования
    [mysqldump]
    quick
    max_allowed_packet = 16M
    # Установка кириллицы
    default-character-set=cp1251 #Указание кодировки
    character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!)

    # Конфигурационные параметры для программы-клиента mysql.exe
    [mysql]
    no-auto-rehash
    # Установка кириллицы
    default-character-set=cp1251 #Указание кодировки
    character-sets-dir=g:/mysql/share/charsets #Указание пути к папке кодировок (скорректируйте для своего сервера!)

    [isamchk]
    key_buffer = 8M
    sort_buffer_size = 8M

    [myisamchk]
    key_buffer = 8M
    sort_buffer_size = 8M

    [mysqlhotcopy]
    interactive-timeout
     
  6. alinyonok

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

    С нами с:
    13 мар 2008
    Сообщения:
    2
    Симпатии:
    0
    Всё пробовал не менятся кодировка
    С utf8_general_ci на cp1251_general_ci.
    Подскажите пошагово: что где надо прописать, какие команды и т.д.
    Надо чтобы везде было cp1251_general_ci вместо того что на картинке:
    [​IMG]
     
  7. Astoret

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

    С нами с:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    Спасибо Sergey89, очень помог твой пост. Двое суток бился, иска))
     
  8. RomanBush

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

    С нами с:
    5 дек 2007
    Сообщения:
    798
    Симпатии:
    0
    Адрес:
    200 км от Москвы
    Astoret
    Вот этот?
    :)
     
  9. Astoret

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

    С нами с:
    28 фев 2008
    Сообщения:
    9
    Симпатии:
    0
    вотэ тот 8)
     
  10. EugeneTM

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

    С нами с:
    19 апр 2008
    Сообщения:
    85
    Симпатии:
    0
    Возможно окончательная победа в войне с utf8

    MySQL
    my.cnf или под виндой my.ini:

    [client]

    default-character-set= utf8

    [mysql]

    default-character-set=utf8

    [mysqld]

    default-character-set=utf8


    В PHP-скрипте
    <?php
    /* create a connection object which is not connected */
    $link = mysqli_init();
    /* connect to server */
    mysqli_real_connect($link, 'localhost', 'root', 'бла-бла-бла', 'бла');

    /* check connection */
    if (mysqli_connect_errno()) {
    printf("Ошибка соединения с БД : %s\n", mysqli_connect_error());
    exit();
    }

    /* Устанавливаем кодировку для корректного вывода в браузере */
    $query = "SET NAMES 'utf8'";
    if (mysqli_query($link,$query) === TRUE) {
    printf("Кодировка UTF8 успешно установлена.\n");
    }
    else {
    printf("Ошибка выполнения запроса на установку кодировки UTF8 для вывода в браузере : %s\n",
    mysqli_error($link));
    exit ();
    }

    /* Устанавливаем кодировку для корректного collation*/
    $query = "SET SESSION collation_connection = 'utf8_general_ci';");
    if (mysqli_query($link,$query) === TRUE) {
    printf("Collation UTF8 успешно установлен.\n");
    }
    else {
    printf("Ошибка выполнения запроса на установку collation UTF8 : %s\n",
    mysqli_error($link));
    exit ();
    }

    /* close connection */
    mysqli_close($link);
    ?>
    Если используете библитеку mysql, соотвтственно подкорректировать вызываемые функции.

    !!!!! Сам PHP-скрипт должен быть в кодировке UTF8

    !!!!! Скрипты MySQL должны быть в кодировке UTF8. Для танкистов: Если в notepad создать текстовый файл, набить какой нибудь код. Этот файл будет иметь кодировку cp1251. Если он будет содержать русские символы, то при попытке выполнить его из под mysql будете посланы на ERROR. Один из примитивных вариантов: в MySQL Query Browser создайте новый Script Tab. В него из Clipboard'а вставте ваш текст. Сохраните его как superpuper.SQL, сравните размер с исходным текстовым файлом. Этот скрипт будет нормально выполняться из под mysql при наличии в нем русских символов. Аналогично проверьте PHP-скрипт.

    !!!!! Вставка из clipboarda винды в командную строку mysql катит только если текст не содержит русских символов. Винда вставляет cp1251, и соответственноо mysql посылает на ERROR.

    Если все это выполнено, нигде никаких упоминаний про cp1251 не нужно.

    PS. Имейте в виду - размер VARCHAR при использовании utf8 не должен превышать 64К/3 = 21,33К
     
  11. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Не думал, что после того чего уже пережил - напишу сюда, но :)
    Винда, кодировки в базах - юникод, на страничках - utf8, то же и скрипты.
    Не пугайтесь, со страничками все хорошо, везде все по русски. Но, решил сегодня воспользоваться консолью мускуловской, не тут то было: ╨Э╨░╤З╨░╤В╨░ вот такие бяки. И сет намес ставил..
    Мне кажется что просто сама консоль 1251 по этому и такие карявости. Я не прав? в любом случае, как это победить, или лучше не париться и юзать как раньше майадмин?
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  13. ShamahN

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

    С нами с:
    10 апр 2007
    Сообщения:
    1.449
    Симпатии:
    0
    Адрес:
    г.Волгодонск Роствской обл.
    Sergey89, спасибо! Вот и лекарство :) а я усиленно скармливал ей 1251 :)
     
  14. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    У меня программа, в которой я php-код редактирую, иногда возмёт да и сохранит файл в однобайтовой кодировке.
    Она это может делать автоматически, если все символы в документе принадлежат одной однобайтовой кодировке и нет ни одного символа из другой.

    Чтобы быть уверенным, вставляю в начало документа комментарий: #юертз ěščřž
    Т.е. набор из символов, которые могут быть одновременно только в многобайтовой кодировке.

    В notpade тоже можно сохранить в utf-8, если при сохранении в окне её выбрать.
     
  15. LokiFC

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

    С нами с:
    27 июн 2008
    Сообщения:
    72
    Симпатии:
    0
    Адрес:
    Default City
    Помогите мне пожалуйста.... :_(

    Пользуюсь консольным клиентом.
    Я создал БД:[sql]CREATE DATABASE admins DEFAULT CHARACTER SET cp1251 COLLATE cp1251_general_ci[/sql]
    Создал таблицу, внес в нее данные и между каждым действием писал[sql] set names c1251;[/sql]
    На самой странице написал:
    HTML:
    1. <meta http-equiv=Content-Type content="text/html; charset=windows-1251" />
    И всеравно пишутся каракули *WALL*
     
  16. Anonymous

    Anonymous Guest

    тоже из консоли?
    У консоли кодировка cp866
     
  17. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    вот скажите мне, ну, есть консоль, ну есть шелл-доступ, и что? Теперь только этим и пользоваться? А вот я ленивый и в консоль лезу только в случаях, когда это действительно надо. Люблю тыкать в кнопки и ссылки :)

    LokiFC
    set names c1251; достаточно 1 раз прописать. После соединения с бд.
    И вполене возможно, что данные твои пишутся нормально. Попробуй отсешь другие варианты.
    В какой кодировке сохранён сам файл? Сомневаюсь, что utf-8, но а вдруг?
    Потом, в апаче есть такая директива, как AddDefaultCharset. Отвечает за кодировку в которой по умолчанию будут отдаваться серваком файлы. И если стоит utf-8 или другая отличная от WINDOWS-1251, то чихал он на
    HTML:
    1. <meta http-equiv=Content-Type content="text/html; charset=windows-1251" />
    . Лечится либу правкой конфига апача, либо отправкой перед выводом текста заголовка
    PHP:
    1. <? header('Content-Type: text/html; charset=CP1251'); ?>
    Вот будешь уверен, что таких косяков нет, можно будет гнать на БД и сочинять всякие извращённые способы заполнения.
     
  18. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Код (Text):
    1. ChCp 1251
    Набери в консоли или обрати внимание на то, что
     
  19. LokiFC

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

    С нами с:
    27 июн 2008
    Сообщения:
    72
    Симпатии:
    0
    Адрес:
    Default City
    2Luge, помогло :D
    Не думал, что проблема может заключатся в неправильном способе задачи кодировке странице...
    ...а это было так....
     
  20. Madkin

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

    С нами с:
    23 янв 2008
    Сообщения:
    18
    Симпатии:
    0
    Доброго времени суток!

    Мужики, что я делаю не так?

    Ситуевина следующая:
    1. База, таблица, записи в кодировке cp1251
    2. Страница в кодировке cp1251
    3. На странице даже вставлен mysql_query("SET NAMES 'cp1251'");

    В итоге страница вылезает в кодировке cp1251(как и задумывалось), данные из мускуля на странице отображаются знаками вопроса(что нежелательно). (((
     
  21. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Может сервер высылает заголовок http в другой кодировке?
    Попробуйте header("Content-type: text/html; charset=windows-1251");
     
  22. Madkin

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

    С нами с:
    23 янв 2008
    Сообщения:
    18
    Симпатии:
    0
    Ну я так понимаю, что изменив в апаче AddDefaultCharset UTF-8 на CP-1251, я вроде бы как сделал тоже самое.

    К сожалению проблема осталась (((.

    Есть ли смысл дефолтовой кодировкой мускуля сделать CP-1251? Сейчас в мускуле повсюду юникод - созданное мной как белая ворона в виндовой кодировке лежит.
     
  23. Madkin

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

    С нами с:
    23 янв 2008
    Сообщения:
    18
    Симпатии:
    0
    Еще раз, здравствуйте!
    Продолжаю мучение:
    Выставил дефолтовую кодировку для mysql в cp1251 - результат от же ((((
    Может кто-нить подбросит совет? вот что имею:
    1. Апаче раздает страницы с параметром AddDefaultCharset CP-1251
    2. Мускуль в настройках my.cnf раздел [mysqld] (может тут беда?) имеет 2 параметра
    - collation_server = cp1251_general_ci
    - character_set_server = cp1251
    3. База, таблицы в базе, записи в таблицах в в cp12-51_general_ci
    4. Страница в windows-1251
    5. Страница имеет mysql_query("SET NAMES 'cp1251'");

    Со всем этим у меня трабла - все что вытягивается из мускуля - на странице превращается в знаки вопроса.

    УПД.
    Загугли решают )) Правильно поставленный поисковый вопрос - 80% сделано
    Добавил следующее после коннекта с базой - заработало

    PHP:
    1.  
    2. <?php
    3. mysql_query ("set character_set_client='cp1251'");
    4. mysql_query ("set character_set_results='cp1251'");
    5. mysql_query ("set collation_connection='cp1251_general_ci'");
    6. ?>
    7.  
    Спамибо ответившим.
     
  24. ZMANZ

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

    С нами с:
    10 мар 2008
    Сообщения:
    161
    Симпатии:
    0
    Здраствуйте!!!
    При добавлении информации через блок администратора в базу данных mysql, в базе данных информация отображается иероглифами, но только когда печатаешь русскими буквами!!! При отправке формы английскими или цифрами приходит все нормально!!! Страница с которой происходит отправка имеет кодировку utf8!!! phpMyAdmin 2.6.1, MySQL 4.1.16, Appach 1.3.33 Php 5.1.2!!!
    Где и что нужно поменять, чтоб небыло этих иероглифов??? Как я понял идет именно несовместимость кодировок страница в utf8, а mysql 1251!!! А так все отображаеца нормально, проблема именно при поступлении данных в базу, приходят ИЕРОГЛИФЫ!!!
     
  25. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    привычку не читать первое же сообщение в теме.