За последние 24 часа нас посетили 18367 программистов и 1612 роботов. Сейчас ищут 1408 программистов ...

Illegal mix of collations

Тема в разделе "MySQL", создана пользователем metallic, 29 дек 2008.

  1. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Торрент-трекер torrentpier 0.35
    Иногда в статусе торрент-клиента выскакивает такая вот ошибка, выяснить когда и от чего это происходит не удается. Ошибка выозникает редко, помогает перезапуск клиента (иногда не с первого раза). Скажите, куда копать?

    Код (Text):
    1. DB error :: tr_announcer.php (380) :: [SQL] SELECT * FROM phpbb_bt_tracker WHERE torrent_id = XXXX AND peer_id = 'XXXX-уџX§Аh®?uъ' LIMIT 1 :: [code]Illegal mix of collations
    (utf8_general_ci,IMPLICIT) and (cp1251_general_ci,COERCIBLE) for operation '='[/code]

    Вываливается на вот этом коде:

    Код (Text):
    1. // Get peer info from previous announce $lp_inf (last peer info) if available
    2. $sql = 'SELECT *
    3.     FROM '. BT_TRACKER_TABLE ."
    4.     WHERE torrent_id = $torrent_id
    5.         AND peer_id = '$peer_id_sql'
    6.     LIMIT 1";
    7.  
    8. if (!$result = $db->sql_query($sql))
    9. {
    10.     error_exit('DB error', __FILE__, __LINE__, 'db');
    11. }
     
  2. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    откуда берётся peer_id_sql?
     
  3. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    sword dancer
    Я так понимаю передается клиентом.
    Могу выложить исходники
     
  4. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    очевидно клиент передаёт какой-то мусор.

    по любому стоит перейти на utf-8.
     
  5. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    sword dancer
    Так база на utf8 и есть
    А что нельзя без ошибок обойтись, хоть даже и клиент передает не то. На других трекерах такого не замечается ведь.
     
  6. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    исправь на

    PHP:
    1. <?
    2.  
    3. $sql = 'SELECT *
    4.   FROM '. BT_TRACKER_TABLE ."
    5.   WHERE torrent_id = $torrent_id
    6.      AND peer_id = '".mysql_escape_string($peer_id_sql)."'
    7.   LIMIT 1";
    8.  
    9. ?>
    10.  
    и не будет тебе ошибок.
     
  7. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а-а-а. ступил.

    так конфликт кодировок.
    скорей всего база или таблица в UTF, а поле с CP1251

    покажи как у тебя?

    Код (Text):
    1.  
    2. mysql> show create table phpbb_bt_tracker\G;
    3. *************************** 1. row ***************************
    4.        Table: phpbb_bt_tracker
    5. Create Table: CREATE TABLE `phpbb_bt_tracker` (
    6.   `torrent_id` mediumint(8) unsigned NOT NULL default '0',
    7.   `peer_id` char(20) character set utf8 collate utf8_bin NOT NULL default '',
    8.   `user_id` mediumint(9) NOT NULL default '0',
    9.   `ip` char(8) character set utf8 collate utf8_bin NOT NULL default '0',
    10.   `port` smallint(5) unsigned NOT NULL default '0',
    11.   `uploaded` bigint(20) unsigned NOT NULL default '0',
    12.   `downloaded` bigint(20) unsigned NOT NULL default '0',
    13.   `complete_percent` bigint(20) unsigned NOT NULL default '0',
    14.   `seeder` tinyint(1) NOT NULL default '0',
    15.   `last_stored_up` bigint(20) unsigned NOT NULL default '0',
    16.   `last_stored_down` bigint(20) unsigned NOT NULL default '0',
    17.   `stat_last_updated` int(11) NOT NULL default '0',
    18.   `speed_up` mediumint(8) unsigned NOT NULL default '0',
    19.   `speed_down` mediumint(8) unsigned NOT NULL default '0',
    20.   `update_time` int(11) NOT NULL default '0',
    21.   `expire_time` int(11) NOT NULL default '0',
    22.   KEY `torrent_id` (`torrent_id`),
    23.   KEY `user_id` (`user_id`)
    24. ) ENGINE=MEMORY DEFAULT CHARSET=utf8
    25. 1 row in set (0.00 sec)
     
  8. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    440Hz
    Боюсь что не поможет, исходниках присутствует следующее:
    $peer_id - это как раз параметр, перед тем как он превратитс в $peer_id_sql с ним происходят следующие приключения

    $peer_id_sql = rtrim(sqlesc($peer_id), ' ');

    гдк sqlesc

    function sqlesc ($x)
    {
    return mysql_escape_string($x);
    }
     
  9. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Ну да, вся база и поле peer_id в utf8
     
  10. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ты покажи что у тебя выведет

    show create table phpbb_bt_tracker\G;

    зпрос, а там посмотрим.

    вот у меня все в UTF, никаких проблем нту.
     
  11. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Код (Text):
    1. CREATE TABLE `phpbb_bt_tracker` (
    2.  `torrent_id` mediumint(8) unsigned NOT NULL default '0',
    3.  `peer_id` binary(20) NOT NULL,
    4.  `user_id` mediumint(8) default NULL,
    5.  `ip` varchar(8) NOT NULL default '0',
    6.  `port` smallint(5) unsigned NOT NULL default '0',
    7.  `uploaded` bigint(20) unsigned NOT NULL default '0',
    8.  `downloaded` bigint(20) unsigned NOT NULL default '0',
    9.  `complete_percent` bigint(20) unsigned NOT NULL default '0',
    10.  `seeder` tinyint(1) NOT NULL default '0',
    11.  `last_stored_up` bigint(20) unsigned NOT NULL default '0',
    12.  `last_stored_down` bigint(20) unsigned NOT NULL default '0',
    13.  `stat_last_updated` int(11) NOT NULL default '0',
    14.  `speed_up` mediumint(8) unsigned NOT NULL default '0',
    15.  `speed_down` mediumint(8) unsigned NOT NULL default '0',
    16.  `update_time` int(11) NOT NULL default '0',
    17.  `expire_time` int(11) NOT NULL default '0',
    18.  KEY `torrent_id` (`torrent_id`),
    19.  KEY `user_id` (`user_id`)
    20. ) ENGINE=MEMORY DEFAULT CHARSET=utf8
     
  12. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    рзницу с моей видишь?
    у тебя или база и что-то еще cp1251 держит, а поля наследуют.
     
  13. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    440Hz
    У вас в бинарнике peer_id хранится
     
  14. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    в общем я сам ничего не придумывал. ставил из исходников как есть. у меня ошибок нету. делай выводы.
     
  15. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    а у вас такая же абракадабра в поле peer_id хранится?
     
  16. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Я просто ставил зарубежную сборку на основе торентпира, уже сто раз пожалел, вначале было много проблем с русским языком и вот до сих пор не все решил, вот эта проблема болше всего бесит
     
  17. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    так поставь нормльную?
    и когда в UTF, то похрен какой язык.
    а per_id все нормльно там. никакой абракадабры. абракадабра клиенту отдается от тебя. и потом к тебе позвращается.
     
  18. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Да она нормальная, просто на русский язык не расчитана.

    И легко сказать поставь :) У меня уже рабочий трекер, почти год в строю (в локальной сети провайдера)
    Поменять его не представляется возможным, уже столько модов прикручено, десятки тысяч сообщений и раздач и тд

    ну у меня записи в поле peer_id что-то проде "-BC0070-nг/<ђT|J"
     
  19. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    440Hz
    покажите пожайлуста пример, что у вас в поле peer_id ?
     
  20. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну так и пропиши полю utf8 binary ? какие проблемы-то?

    p.s. я свой трекер остановил. я его ставил что бы посмотреть как оно живет для опыта и общего развития.
     
  21. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    поставил utf8 binary
    Теперь посмотрим что будет, баг неприятен тем, что проявляется не сразу, надо ждать.
     
  22. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    дык база в ютф, а клиент в системкой кодировке, которая обычно 1251. переводи клиента на ютф и будет всё хорошо.
     
  23. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
  24. metallic

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

    С нами с:
    29 дек 2008
    Сообщения:
    13
    Симпатии:
    0
    Клиент - это программа, типа uTorrent
     
  25. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    тогда надо выяснить какая именно программа, а так же проверить кодировку торрент-файлов.