За последние 24 часа нас посетили 16652 программиста и 1690 роботов. Сейчас ищут 894 программиста ...

Кодировка mysql+php

Тема в разделе "MySQL", создана пользователем lacost, 12 ноя 2009.

  1. lacost

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

    С нами с:
    7 апр 2008
    Сообщения:
    57
    Симпатии:
    0
    Никак не могу разобраться где собака зарыта.
    опишу по порядку мои действия:

    Устанавливаю кодировку по умолчанию для моей Бд
    [sql]alter database base charset utf8;[/sql]
    Навсякий случай делаю тоде самое для таблицы:
    [sql]
    CREATE TABLE `chartest` (
    `name` varchar(10) default NULL
    ) ENGINE=MyISAM CHARACTER SET=utf8
    [/sql]
    В результате в консоли я могу номр видеть русский текст
    но вот когда осушествляю запрос php вида
    PHP:
    1.  
    2. <?php
    3. $query="SET NAMES utf8";
    4.     mysql_query($query, $link) or die('Query failed : ' . mysql_error($link));
    5.     $query = "SELECT * FROM chartest";
    6.     $result = mysql_query($query, $link) or die('Query failed : ' . mysql_error($link));
    7.       while($row = mysql_fetch_array($result))
    8.       {
    9.         echo  $row[name];
    10.         ?><br><?
    11.       }
    12.  
    Получаю что то вроде "ë®à ¢¯ë"

    И ещё вопрос везеде рекомендуют использовать кодировку utf8 вместо cp1251 в чём же принципиальное отличие?
     
  2. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    lacost
    что за ос? скрипт тоже из консоли запускаете?
     
  3. lacost

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

    С нами с:
    7 апр 2008
    Сообщения:
    57
    Симпатии:
    0
    OC Windows XP
    Прастите какой именно скрипт из консоли?
    Первые две Sql команды выполняются в консоли.
    Скрипт php на сервере..
     
  4. ATI

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

    С нами с:
    3 янв 2008
    Сообщения:
    254
    Симпатии:
    0
    Адрес:
    Москва
    HTML:
    1. <meta http-equiv="content-type" content="text/html; charset=utf-8">
    Файл должен быть сохранён в utf8.
     
  5. lacost

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

    С нами с:
    7 апр 2008
    Сообщения:
    57
    Симпатии:
    0
    Очень интерестны коментарии знающих людей чтобы обьяснить мне происходящее...
    и так
    создаём табличку:
    [sql]
    CREATE TABLE `base`.`utf` (
    `NAME` VARCHAR( 30 ) NOT NULL
    ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
    [/sql]

    Далее пишем пхп код:

    PHP:
    1.  
    2. <?php
    3. header('Content-Type: text/html; charset=utf8');// отображать страничку в utf 8 по умолчанию  
    4. $link = mysql_connect("localhost", "root", "198918")    or die("Could not connect : " . mysql_error());
    5.     mysql_select_db("BASE") or die("Could not select database");
    6.     mysql_query("insert into utf values('Новый текст');",$link)  or die('Query failed : ' . mysql_error($link));
    7.     $query = "SELECT * FROM utf";
    8.     $result = mysql_query($query, $link) or die('Query failed : ' . mysql_error($link));
    9.       while($row = mysql_fetch_array($result))
    10.       {
    11.         echo  $row[NAME];
    12.         ?><br>Текст страницы<br><?
    13.       }
    14. ?>
    15.  
    Просматриваем в барузере что у нас получилось

    меняем кодировку страницы в браузере на ср1251 или меняем header('Content-Type: text/html; charset=utf8'); на
    header('Content-Type: text/html; charset=ср1251');
    получаем
    Обьсните почему ведь на сколько я понимаю страница должна быть в utf8

    Теперь проделаем тоже самое только создадим таблицу в кодировке сp1251
    в результате на страничке получаем
    И снова порос как так? я совсем запутлася...
     
  6. messershmitt

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

    С нами с:
    2 ноя 2009
    Сообщения:
    45
    Симпатии:
    0
    re

    привет!
    у меня стоит winxp я делал так: создавал базу
    Код (Text):
    1.  
    2. CREATE DATABASE `ttt` CHARACTER SET utf8 COLLATE utf8_general_ci;
    3.  
    создавал таблицу
    Код (Text):
    1.  
    2. CREATE TABLE `users` (
    3.     `id` INT( 11 ) NOT NULL AUTO_INCREMENT, `name` CHAR( 30 ) NOT NULL, `age` SMALLINT( 6 ) NOT NULL, PRIMARY KEY(
    4.     `id`
    5.     )
    6.     )
    В скриптах после соединения писал установку кодировки
    Код (Text):
    1.  
    2.  
    3. mysql_query"SET NAMES CP1251";
    если надо с консоли вывод смотреть, то в консоли mysql пишешь


    Код (Text):
    1.  
    2.  
    3. SET NAMES CP866;
     
  7. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    lacost
    так как текст "Текст страницы" стал отображаться корректно после смены кодировки в браузере на ср1251, то делаем вывод, что сам исходник у вас сохранен в этой кодировке. попробуйте в вашем редакторе переконвертировать его в утф8. как только "Текст страницы" будет отображаться в браузере нормально при установленной кодировке утф8, можно будет переходить к базе данных.

    для начала добавьте в майскл.ини
    init-connect = "set names utf8"

    и пробуйте)
     
  8. lacost

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

    С нами с:
    7 апр 2008
    Сообщения:
    57
    Симпатии:
    0
    messershmitt, спасибо, ваш пример работает и кстати далж возможность работать с данными как в консоли так и в скриптах.

    iliavlad, спасибо чо подсказали, вы были правы насчтё кодировки странички.

    Но вот в чём вопросс зачем нам устанавливать кодировку utf8 на БД если потом мы читаем и пишем в неё в кодировке cp1251 или если используем консоль то cp866? и почему при смене кодировки таблицы на ср1251 что казалось бы логичнее снова появляются "?????"
     
  9. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    SET NAMES перед записью в базу говорит SQL серверу в какой кодировке ожидать данные. При запросе на выборку SET NAMES указывает в какой кодировке вернуть данные клиенту.
     
  10. messershmitt

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

    С нами с:
    2 ноя 2009
    Сообщения:
    45
    Симпатии:
    0
    re

    Я долго искал ответ на этот вопрос но методом тыка у меня получилось то, что я вам написал выше в примере!
    Я думаю, что дело вот в чем на самом деле!
    Мои мысли на счет кодировки такие: когда мы создаем базу данных, то по
    умолчанию там лучше установить кодировку utf8, эта же кодировка
    переходит и в таблицы базы данных, если не переустановить ее конечно. Кодировка любимой windows
    cp1251 и занося текст в таблицу, текст соответственно будет туда попадать в кодировке utf8, что потом
    будет не читабельно в винде, но у меня такое ощущение, что он с удовольствием прочитается в unix и linux
    системах, таким образом выше правильно написали, что перед занесением текста в таблицу
    мы из php даем серверу mysql комманду на установку текста в cp1251 текст в базу попадает уже
    в кодировке ср1251, что при выводе дает нам нормальные русские буковки:), а вот с консолью
    это все из -за dos, там кодировка cp866 и наверное ничего тут сделать нельзя:).
    Это лично мои мысли и если что то не так поправьте, хотелось бы правильно разбираться в этом вопросе!
     
  11. lacost

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

    С нами с:
    7 апр 2008
    Сообщения:
    57
    Симпатии:
    0
    Я понял о чём вы говорите тоесть текст в таблице назодится в кодировке cp1252 пишим читаем его мы в этой кодировке соотвественно и видим руские буковки но по факту в таблице у нас кодировка uft8 и прочитай мы в кодировке utf8 то увидели бы иероглифы кстаи мы их и увидем если напишем set names utf8 но вот чего я не пойму так это почему нельза установить на таблицу кодировку cp1252 и читать и записываь в неё в этой кодировке и радоваться жизни...но выше я уже приводил пример что будет если так сделать....тоесть на 50% я понимаю как это всё работает но был бы признателен если бы кто то подробно разживал всё эту кашу с кодировками

    И кстати, messershmitt, ещё рас большое спасибо ща ваш пример я теперь хоть работать могу с русским текстом как в консоли так и с помошью скриптов :)
     
  12. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Напишу свои соображения по поводу кодировок.

    1) Если делаешь проект изначально сам, то лучше всего везде, где можно использовать одну кодировку, желательно utf-8.

    2) При передачи данных, откуда-либо куда-либо "приемник" должен знать в какой кодировке данные ему передаются.
    По поводу "приемника":

    2.1 Когда сохраняем скрипт в файл("приемником" является файл), нужно указывать кодировку, в которой мы сохраняем. Если проект состоит из нескольких файлов, то их всех надо сохранять в одной кодировке. Желательно utf-8.
    Пример:
    PHP:
    1.  
    2. <?php
    3. header("Content-Type: text/html; charset=utf-8");
    4. echo "Русcкий текст";
    5. >
    6.  
    Если сохранить этот файл в кодировке utf-8, то в браузере выведется все хорошо. Если сохраним этот файл в win1251 то в браузере скрипт покажет иероглифы.

    2.2 Когда передаем клиенту страницу, ("приемником" является браузер), мы сообщаем через заголовок
    Content-Type: text/html; charset=utf-8
    в какой кодировке данные, которые мы передаем. В PHP это делается с помощью функции:
    PHP:
    1.  
    2. header("Content-Type: text/html; charset=utf-8");
    3.  
    2.3 Когда записываем данные в базу. Нам нужно указать "приемнику"(базе) в какой кодировке данные мы ей собираемся
    передавать. При этом не имеет значение в какой кодировке создана таблица, куда мы хотим записать данные.
    В MYSQL это делается командой SET NAMES "Константа кодировки"
    В PHP через функцию
    PHP:
    1.  
    2. mysql_query("SET NAMES utf8");
    3.  
    Т.е. При записи в базу в SET NAMES надо указывать кодировку источника (т.е. скрипта) а не кодировку таблицы.


    2.4 При чтении из базы, SET NAMES задает кодировку в которой нам вернет данные MYSQL. И не важно в какой кодировке они хранятся в таблице. Тут "приемником" является скрипт(файл) в котором будете выводить данные из базы.[/php]

    И в завершении:
    Если браузер получает заголовок
    Content-Type: text/html; charset=utf-8
    то тег
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    не имеет никакого значения.
     
  13. Anonymous

    Anonymous Guest

    РљРѕРґРёСЂРѕРІРєР° mysqlphp

    В C# используется кодировка Unicode. Чтобы можно было работать с текстовыми файлами, содержащими русские символы, созданными, например, в Блокноте, нужно их перекодировать. Скажем, так:
    Код:using System.Text;using System.IO;StreamReader stream = new StreamReader"name.txt", Encoding.GetEncoding1251;1251 - номер кодовой страницы.