За последние 24 часа нас посетили 16747 программистов и 1644 робота. Сейчас ищут 1023 программиста ...

mysql не может проглотить символ

Тема в разделе "Прочие вопросы по PHP", создана пользователем kerranswell, 3 дек 2014.

  1. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    При попытке в phpmyadmin занести данные в таблицу выдается след ошибка

    Warning: #1366 Incorrect string value: '\xF0\x9F\x92\x98' for column 'txt' at row 1

    Спотыкается mysql на некоем символе, который пришел из описания к видео инстаграмма (на инстаграмме он выводился как квадратик) и является скорее всего интерпритацией смайлика эмодзи, так как vk к примеру распознал этот символ и вывел вместо него картинку "сердечко".

    Хотел привести символ здесь, но при создании темы этот форум его тоже не переварил и вывел следующее :)
    Структура таблицы

    Код (Text):
    1.  
    2. CREATE TABLE IF NOT EXISTS `test` (
    3.   `id` int(11) NOT NULL AUTO_INCREMENT,
    4.   `txt` text,
    5.   PRIMARY KEY (`id`)
    6. ) ENGINE=InnoDB  DEFAULT CHARSET=utf32 AUTO_INCREMENT=2 ;

    Результат вставки:

    Код (Text):
    1.  
    2. INSERT INTO `test` (`id`, `txt`) VALUES
    3. (1, '????');

    Вначале кодировка была utf8_general_ci, затем я сделал utf8mb4 и utf32 - ничего не помогает.

    Вопрос: как в php можно отловить подобный символ, а лучше все подобные ему, чтобы mysql не крашился и не обрезал весь текст, идущий после него?
     
  2. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
  3. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Попробовал, не помогло.

    Добавлено спустя 1 минуту 40 секунд:
    вобще такое шестнадцатиричное число "F09F9298" выходит за пределы даже 4 мегабайт, думается, в этом проблема
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    При чем здесь мегабайты? ))) Ты хотел сказать про четыре байта на символ? UTF-8 может и шесть байт на символ кодировать, хотя для всего Unicode достаточно четырех.
     
  5. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    да, чето я пургу прогнал)
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    короче, это невалидная последовательность для utf-8. не знаю где ты её откопал, но это реально ошибка.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    переконверть в php из utf8 в utf8 и посмотри что получится =)
     
  8. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    откопал не я, пользователь внес это в текст. Значит существует вероятность повторения подобной ошибки. Вопрос в том, как эту "невалидную последовательность" отследить и устранить прежде чем сохранять в базу.
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а эскейпить данные не пробовали? говорят помогает от инвалидный последовательностей. и даже от инъекций спасет. но это бесплатное дополнение.
     
  10. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    пробовал. mysql_real_escape_string никак не затрагивает этот символ, оставляет его как есть.
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а "реальная" кодировка согласована?
     
  12. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    какая такая "реальная"?
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    или вы просто так выбрали эту функцию? ну есть просто экранирование а есть с учетом кодировки. реал - требует чтоб кодировка соединения была согласована. ну там типа set names как минимум. а чтоб лишних запросов не делать - соответствующие функции библиотеки mysqli.
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    можешь сделаешь микро-фак по экранированию mysqli и PDO? малюсенький.
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    mysqli_real_escape_string не спасет от ошибки с неправильной строкой utf8
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    она правильная но для utf8mb4
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
  18. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    с чего вы взяли? utf8mb4 ведь тоже не проглатывает
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну мне естественно хочется вас запутать и дать вам ложную надежду. есть база в утф8мб4, есть таблицы в утф8мб4, есть поля в утф8мб4, вставляю текст с "сердечком со стрелой" (чисто ведь в вашем примере именно стрела вам сердце ранит) - вставляется без ошибок. делаю выборку - выбирает без ошибок, всё показывает как надо. конечно я что-то делаю не так. пойду отсюда. извините меня.
     
  20. kerranswell

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

    С нами с:
    19 май 2008
    Сообщения:
    16
    Симпатии:
    0
    Какая драма! Какой накал! :)
    Я сделал и базу и таблицу и поле в utf8mb4_general_ci, но все равно ошибка присутствует. Разница в том, что текст после символа не затерся, просто символ превратился в "????" Это уже лучше
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да, и это скорее всего говорит о том что соединение не в той кодировке. база/таблица/поле понимают размещение 3-4-байтных последовательностей а но само соединение убивает последовательность либо еще на вставке либо на выборке. хексы по полю покажут в какой момент.