За последние 24 часа нас посетили 16780 программистов и 1646 роботов. Сейчас ищут 888 программистов ...

Кириллица и База Данных

Тема в разделе "PHP для новичков", создана пользователем ionico, 25 сен 2008.

  1. ionico

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

    С нами с:
    16 авг 2008
    Сообщения:
    73
    Симпатии:
    0
    Здравствуйте, ув. программисты.
    У меня существенная проблема, в которой я никак не могу разобраться =(

    Мне необходимо хранить в БД кирилический текст...

    SHOW VARIABLES LIKE 'char%'

    показывает это:

    Код (Text):
    1. Variable_name ----------------- Value
    2. character_set_client------------ utf8
    3. character_set_connection ----- utf8
    4. character_set_database ------- utf8
    5. character_set_filesystem ------ binary
    6. character_set_results ---------- utf8
    7. character_set_server ---------- latin1
    8. character_set_system --------- utf8
    9. character_sets_dir ------------- /usr/share/mysql/charsets/
    вместо необходимой кирилической строки записывается "пустая" строка =(

    когда речь шла о сохранении имени пользователя воспользовался htmlentities,
    но сейчас надо записывать комментарии, они содержат куда больше текста, и после конвертации занимают очень много места в БД... (вместо одного символа получается от 4х символов кодировки)

    можно ли каким-нибудь образом записать кириллицу в БД, если сервер в кодировке latin1 ?
    чтобы при этом латиница также хранилась...

    заранее спасибо...
    с уважением, Дмитрий.
     
  2. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    1. iconv();
    2. SET NAMES latin1;
     
  3. ionico

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

    С нами с:
    16 авг 2008
    Сообщения:
    73
    Симпатии:
    0
    а можно поподробнее? про iconv() почитал.

    Допустим мне надо сохранить строку: "Привет меня зовут Gennadiy"
    в БД, а потом вывести её другим скриптом обратно, чтобы она выглядела точно так же (и кирилица и латиница).
    какие кодировки надо выставить на поля в таблице БД ?

    скрипт записи:

    Код (Text):
    1. коннект к БД
    2.  
    3. $mystring = "Привет, меня зовут Gennadiy";
    4.  
    5. $query = "INSERT INTO my_table(str) VALUES ('$mystring')";
    6.  
    7. mysql_query ($query);
    а в другом скрипте:

    Код (Text):
    1. коннект к БД
    2.  
    3. $query = "SELECT str FROM my_table";
    4.  
    5. $res = mysql_query ($query);
    6.  
    7. if (!$res) {
    8.  
    9. exit ("ERROR - query could not be executed!");
    10.  
    11. } else {
    12.  
    13. $inf = mysql_fetch_array($res);
    14.  
    15. echo "<br>моя строка = ".$inf['str']."<br>";
    16.  
    17. }
    запишет ли первый скрипт строку правильно и выведет ли второй скрипт строку в правильной кодировке?
    напоминаю, что сервер в кодировке "latin1"...

    заранее спасибо.
    с ув. Дмитрий
     
  4. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    зависит от кодироки данных и типа соединение. Читайте мой первый коммент.
    Пример использования iconv()

    $text = iconv('cp1251, 'latin1', $text);

    Тип соединение выставляется след. образом:

    mysql_query('SET NAMES latin1');

    После получения данных конвертируйте данные обратно, как вам надо, например:

    $row = mysql_fetch_row($data);

    $text = $row[0];

    echo iconv('latin1', 'cp1251', $text);
     
  5. Rayon

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

    С нами с:
    27 сен 2008
    Сообщения:
    21
    Симпатии:
    0
    Всегда использовал mysql_query("SET NAMES cp121(ну или др кодировка)"); после подключения сразу и проблем не позникало
     
  6. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    используйте utf-8, кириллица уходит в историю...
     
  7. ionico

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

    С нами с:
    16 авг 2008
    Сообщения:
    73
    Симпатии:
    0
    а почему же в Ваших примерах везде стоит "latin1" ? из-за моего сервера?
     
  8. ionico

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

    С нами с:
    16 авг 2008
    Сообщения:
    73
    Симпатии:
    0
    Огромное спасибо neverlose за подсказку функции iconv()!

    Единственное, что теперь смущает - это то, что я использую кодировку "ISO-8859-1"
    Она прописана в input_encoding, output_encoding, internal_encoding в PHP.ini на сервере... этот файл я редактировать не могу, хостер не даёт такой возможности.

    Я кодирую строку таким образом:

    Код (Text):
    1. $text = iconv("ISO-8859-1","utf-8", $d);
    записываю её в БД (поля таблицы в "UTF-8").

    А потом после извлечения из БД декодирую так:

    Код (Text):
    1. $new_string = iconv("utf-8", "ISO-8859-1", $text);
    У меня всё отображается нормально. Проверял ещё на нескольких машинах, тоже всё ОК.

    Подскажите, если я буду кодировать таким образом, будет ли информация правильно отображаться у всех?
    Мне не очень нравится, что приходится пользоваться "ISO-8859-1"...
     
  9. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    input_encoding, output_encoding, internal_encoding

    Значения этих переменных изменяется вот этим:

    mysql_query('SET NAMES utf8');
     
  10. Victor Bazinov

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

    С нами с:
    30 окт 2007
    Сообщения:
    69
    Симпатии:
    0
    +
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ;)
     
  11. ionico

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

    С нами с:
    16 авг 2008
    Сообщения:
    73
    Симпатии:
    0
    в том то и проблема, что я делаю SET NAMES сразу после коннекта к БД, но значения не меняются =(
    поэтому работает только так, как я написал в предыдущем ответе!
     
  12. neverlose

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

    С нами с:
    27 авг 2008
    Сообщения:
    1.112
    Симпатии:
    20
    У кого как :)