При попытке в phpmyadmin занести данные в таблицу выдается след ошибка Warning: #1366 Incorrect string value: '\xF0\x9F\x92\x98' for column 'txt' at row 1 Спотыкается mysql на некоем символе, который пришел из описания к видео инстаграмма (на инстаграмме он выводился как квадратик) и является скорее всего интерпритацией смайлика эмодзи, так как vk к примеру распознал этот символ и вывел вместо него картинку "сердечко". Хотел привести символ здесь, но при создании темы этот форум его тоже не переварил и вывел следующее Структура таблицы Код (Text): CREATE TABLE IF NOT EXISTS `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `txt` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf32 AUTO_INCREMENT=2 ; Результат вставки: Код (Text): INSERT INTO `test` (`id`, `txt`) VALUES (1, '????'); Вначале кодировка была utf8_general_ci, затем я сделал utf8mb4 и utf32 - ничего не помогает. Вопрос: как в php можно отловить подобный символ, а лучше все подобные ему, чтобы mysql не крашился и не обрезал весь текст, идущий после него?
Попробовал, не помогло. Добавлено спустя 1 минуту 40 секунд: вобще такое шестнадцатиричное число "F09F9298" выходит за пределы даже 4 мегабайт, думается, в этом проблема
При чем здесь мегабайты? ))) Ты хотел сказать про четыре байта на символ? UTF-8 может и шесть байт на символ кодировать, хотя для всего Unicode достаточно четырех.
короче, это невалидная последовательность для utf-8. не знаю где ты её откопал, но это реально ошибка.
откопал не я, пользователь внес это в текст. Значит существует вероятность повторения подобной ошибки. Вопрос в том, как эту "невалидную последовательность" отследить и устранить прежде чем сохранять в базу.
а эскейпить данные не пробовали? говорят помогает от инвалидный последовательностей. и даже от инъекций спасет. но это бесплатное дополнение.
или вы просто так выбрали эту функцию? ну есть просто экранирование а есть с учетом кодировки. реал - требует чтоб кодировка соединения была согласована. ну там типа set names как минимум. а чтоб лишних запросов не делать - соответствующие функции библиотеки mysqli.
ну мне естественно хочется вас запутать и дать вам ложную надежду. есть база в утф8мб4, есть таблицы в утф8мб4, есть поля в утф8мб4, вставляю текст с "сердечком со стрелой" (чисто ведь в вашем примере именно стрела вам сердце ранит) - вставляется без ошибок. делаю выборку - выбирает без ошибок, всё показывает как надо. конечно я что-то делаю не так. пойду отсюда. извините меня.
Какая драма! Какой накал! Я сделал и базу и таблицу и поле в utf8mb4_general_ci, но все равно ошибка присутствует. Разница в том, что текст после символа не затерся, просто символ превратился в "????" Это уже лучше
да, и это скорее всего говорит о том что соединение не в той кодировке. база/таблица/поле понимают размещение 3-4-байтных последовательностей а но само соединение убивает последовательность либо еще на вставке либо на выборке. хексы по полю покажут в какой момент.