Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Проблема при записи данных в MYSQL  (Прочитано 1171 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн androgin

  • Автор темы
  • Любитель
  • *
  • Сообщений: 90
    • Просмотр профиля
    • Black-Sun
есть скрипт php, который запускается  скриптом bash в скрипте пхп происходит считывание данных с одного сервера ( в кодировке CP1251 ), додирует в UTF-8 и записывает в базу mysql.

При просмотре в phpmyadmine данные отображаются в непонятной кодировке, соответственно и на сайте. В webmine при просмотре базы - видится все нормально (хотя у него кодировка тоже UTF-8, как показывает firebug). При записи в файл из скрипта php записывается вё правильно в кодировке utf-8.

Кто знает в чем может быть проблема? чем отличаются кодировки webmin и mysql?

Cпасибо
Хорошо там, где нас нет. А там, где мы есть - ещё лучше.

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Проблема при записи данных в MYSQL
« Ответ #1 : 25 Июня 2010, 18:50:50 »
в скрипте надо бы делать set names utf8; и соответственно set names cp1251;
ArchLinux x86_64

Оффлайн androgin

  • Автор темы
  • Любитель
  • *
  • Сообщений: 90
    • Просмотр профиля
    • Black-Sun
Re: Проблема при записи данных в MYSQL
« Ответ #2 : 25 Июня 2010, 18:56:34 »
в скрипте надо бы делать set names utf8; и соответственно set names cp1251;

Вот содержание скрипта, надо было раньше выложить.

@header('Content-type: text/html; charset=utf-8');
function convert_data($array, $from, $to){
    foreach($array as $key=>$value){
        if(is_array($value)) {
            $result[$key] = htmlspecialchars(iconv($from, $to, $value));
            continue;
        }
        $result[$key] = htmlspecialchars(iconv($from, $to, $value));
    }
    return $result;
}

if (!empty($_GET['time'])) $time = (int)$_GET['time']; else $time = 5;
echo date("Y-m-d H:i:s");
$conn = @mssql_connect(....);
@mssql_select_db(......, $conn);

$conn2 = @mysql_connect(.........);
@mysql_select_db(......., $conn2);
@mysql_query("SET NAMES UTF-8");


$all_e_tickers = @mssql_query("SELECT ........ WHERE ....... LIKE 'E%' AND ........");
if (!empty($all_e_tickers)) {
   while ($data = mssql_fetch_assoc($all_e_tickers)) {
      $e_tickers[$data['...']] = convert_data($data, "CP1251", "UTF-8");
   }
   $date = mysql_fetch_assoc(mysql_query("SELECT ..... FROM .... WHERE ....='E'"));
   $date_add = $date['.....'];
   if (!empty($e_tickers) && (mktime() > ($date_add + $time))) {
      mysql_query("UPDATE ...... SET `value`='".serialize($e_tickers)."', `date`='".mktime()."' WHERE `type`='E'");
      file_put_contents("/home/life/123.txt", serialize($e_tickers));
   }
}

@mssql_close($conn);
@mysql_close($conn2);



так вот... в mysql криво записывается. а в файл правильно :(
Хорошо там, где нас нет. А там, где мы есть - ещё лучше.

Оффлайн apl

  • Активист
  • *
  • Сообщений: 689
  • Calculate linux
    • Просмотр профиля
    • Атеисты и безбожники
Re: Проблема при записи данных в MYSQL
« Ответ #3 : 25 Июня 2010, 20:21:52 »
SHOW CREATE TABLE ????

Возможно не указал character set и collate
Core2Duo 6600, 4Gb RAM, 1000Gb HDD, Nvidia GeForce 8800 GTS, Calculate linux

Оффлайн androgin

  • Автор темы
  • Любитель
  • *
  • Сообщений: 90
    • Просмотр профиля
    • Black-Sun
Re: Проблема при записи данных в MYSQL
« Ответ #4 : 25 Июня 2010, 20:34:17 »
нет, всё указано :(

Пользователь решил продолжить мысль 25 Июня 2010, 20:37:53:
причем что самое интересное - такой же косяк происходит если я дамп базы загружаю mysql через WEBMIN. в phpmyadmin'e и на сайте - кракозябры, а в webmin'e всё круто... как так?
« Последнее редактирование: 25 Июня 2010, 20:37:53 от androgin »
Хорошо там, где нас нет. А там, где мы есть - ещё лучше.

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Проблема при записи данных в MYSQL
« Ответ #5 : 26 Июня 2010, 00:08:14 »
для conn set names не задан, только для conn2.
так же непонятен финт вида foreach($array as $key=>$value){
        if(is_array($value)) {
            $result[$key] = htmlspecialchars(iconv($from, $to, $value));
            continue;
        }
        $result[$key] = htmlspecialchars(iconv($from, $to, $value));
    }
смахивает на ошибку. Так же посмотри кодировку в настройках того самого mysqladmin и, собственно, на сайте.
ArchLinux x86_64

Оффлайн androgin

  • Автор темы
  • Любитель
  • *
  • Сообщений: 90
    • Просмотр профиля
    • Black-Sun
Re: Проблема при записи данных в MYSQL
« Ответ #6 : 27 Июня 2010, 22:21:37 »
для conn set names не задан, только для conn2.
так же непонятен финт вида foreach($array as $key=>$value){
        if(is_array($value)) {
            $result[$key] = htmlspecialchars(iconv($from, $to, $value));
            continue;
        }
        $result[$key] = htmlspecialchars(iconv($from, $to, $value));
    }
смахивает на ошибку. Так же посмотри кодировку в настройках того самого mysqladmin и, собственно, на сайте.

у mssql нет сет неймс.

функция же предназначена для перегона данных из CP1251 (от мсскул получаются данные именно в CP1251) в UTF-8 (кодировка Mysql).
Хорошо там, где нас нет. А там, где мы есть - ещё лучше.

Оффлайн DnSL48

  • Активист
  • *
  • Сообщений: 286
    • Просмотр профиля
Re: Проблема при записи данных в MYSQL
« Ответ #7 : 28 Июня 2010, 00:06:28 »
        if(is_array($value)) {
            $result[$key] = htmlspecialchars(iconv($from, $to, $value));
            continue;
        }
вот этот кусок, по всей видимости, должен проходить каждый элемент массива, чего он не делает - по этому я и заговорил про ошибку.

П.С. скорее всего, просто-напросто, не выбрана правильная кодировка в самом phpmyadmin
ArchLinux x86_64

Оффлайн androgin

  • Автор темы
  • Любитель
  • *
  • Сообщений: 90
    • Просмотр профиля
    • Black-Sun
Re: Проблема при записи данных в MYSQL
« Ответ #8 : 28 Июня 2010, 00:08:39 »
        if(is_array($value)) {
            $result[$key] = htmlspecialchars(iconv($from, $to, $value));
            continue;
        }
вот этот кусок, по всей видимости, должен проходить каждый элемент массива, чего он не делает - по этому я и заговорил про ошибку.

П.С. скорее всего, просто-напросто, не выбрана правильная кодировка в самом phpmyadmin

если бы этот кусок не работал, то в файл записывались бы данные в CP1251 туда они записываются в UTF-8, так что всё работает правильно. в phpmyadmine кодировка та же, которая на сайте, т.е. та, которая и должна быть.
Хорошо там, где нас нет. А там, где мы есть - ещё лучше.

Оффлайн Nomadian

  • Участник
  • *
  • Сообщений: 232
    • Просмотр профиля
Re: Проблема при записи данных в MYSQL
« Ответ #9 : 28 Июня 2010, 01:01:38 »
Это некрасиво, тормозит, но часто является единственным "хаком" при конвертации cp1251 --> utf8 в mySQL.

Для каждой строковой переменной в запрос добавляется явный CAST в utf8 кодировку:
CAST(_binary  'текстовое значение' AS CHAR CHARACTER SET utf8)
Внимание: для "защиты от дураков" нужно тем или иным способом отрабатывать одинарные кавычки в содержимом переменной.

 

Страница сгенерирована за 0.019 секунд. Запросов: 20.