Задать вопрос
@LeonidPokrovskiy

Как убрать 'плохие' символы из строки?

Важно, тостер удаляет автоматически [ПЛОХОЙ СИМВОЛ], поэтому вместо самого символа я вынужден писать [ПЛОХОЙ СИМВОЛ]

MySQL начал выдавать такую ошибку:
STMT ERROR: Incorrect string value: '\xF0\x9F\x92\xAA\xF0\x9F...' for column 'full_description' at row 1


Оказалось, что ошибка появляется только если в строке, которую скрипт пытается вставить в базу данных есть символ [ПЛОХОЙ СИМВОЛ]

5de30bf3df594261677177.jpeg

Как можно это исправить? Нужно, чтобы символ [ПЛОХОЙ СИМВОЛ] перестал вызывать эту проблему.

Как выяснилось, тостер автоматически удаляет этот символ. Как это реализовано? Как убрать все плохие символы из строки как тостер?
  • Вопрос задан
  • 2111 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Скорее всего, для поля, в которое записывается строка, установлена (непосредственно или унаследованно от таблицы или базы данных) кодировка utf8. В MySQL она допускает только одно-, двух- и трёхбайтные символы, или диапазон U+0000-U+FFFF.
Но символы юникода сейчас заканчиваются на U+10FFFF, в этом расширенном диапазоне находятся, например, шрифтовые эмоджи. Эти символы в utf-8 занимают четыре байта, и для хранения их в MySQL необходимо использовать кодировку utf8mb4.
Просто смените кодировку поля и ошибка исчезнет.
Ответ написан
Комментировать
@bkosun
Кодировка utf8 в MySQL - это псевдоним для utf8mb3 (3-байтовое кодирование). Для полноценной работы UTF-8 (4-байтовое кодирование) в MYSQL 5.5 добавлена кодировка utf8mb4.

https://dev.mysql.com/doc/refman/5.5/en/charset-un...
https://dev.mysql.com/doc/refman/5.5/en/charset-un...
https://dev.mysql.com/doc/refman/5.5/en/charset-un...

Вам следует использовать utf8mb4, или удалить все 4-байтные символы:

NOTE: you should not just strip, but replace with replacement character U+FFFD to avoid unicode attacks, mostly XSS:

unicode.org/reports/tr36/#Deletion_of_Noncharacters

preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $value);




https://stackoverflow.com/questions/8491431/how-to...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы