У меня есть сайт, который принимает основанные на форме входные данные от пользователей и сохраняет их в базе данных mysql (i). 99% пользователей из США.
Если пользователь находится на мобильном устройстве и решает, что было бы интересно использовать эмодзи в одном из полей формы, результирующий SQL вызывает ошибку при попытке ОБНОВИТЬ или ВСТАВИТЬ. Это связано с тем, что эмодзи находится за пределами utf-8 и, следовательно, несовпадение кодировки между UX и БД. Я верю, что понимаю основную проблему.
Я нахожусь на MySQL 5.5, так что я действительно мог бы поддерживать набор символов utf8mb4 — но пройдет некоторое время, прежде чем я смогу обойти это.
В то же время, было бы нормально / безопасно просто сделать это (в PHP):
$sql = "INSERT INTO my_table ... *long insert statement across two dozen rows*";
$sql = utf8_decode($sql);
$db->sql_query($sql);
Так что — просто заставить весь оператор SQL к utf-8? Я понимаю, что персонажи эмодзи и некоторые другие могут быть преобразованы в «?» — но до тех пор, пока само утверждение не будет нарушено или я не потеряю обычный текстовый ввод от пользователей, я буду в порядке с этим.
Есть ли проблемы с этой идеей в качестве временного исправления, пока я не смогу преобразовать схемы таблицы для работы с utf8mb4?
РЕДАКТИРОВАТЬ: Ошибка, возвращаемая из базы данных выглядит следующим образом:
"Incorrect string value: '\xF0\x9F\x99\x8A...' for column..."
Некоторые факты:
utf8
charset может представлять только BMP, это на самом деле не полный UTF-8 (ура MySQL)utf8mb4
utf8
В столбце charset MySQL просто отбрасывает неподдерживаемые символы (уу молчаливое повреждение данных)utf8_decode
не «принуждает все к UTF-8», скорее он преобразует строку из кодировки UTF-8 в кодировку ISO-8859-1 («Latin-1»); это отбросит гораздо больше персонажей, чем просто эмодзиПоэтому мне кажется, что у вас есть какая-то другая основная проблема, если в какой-то момент выдается реальная ошибка. Может быть, вы думаете, что говорите со своей базой данных в UTF-8, когда на самом деле это не так. Вы должны установить свой кодировка соединения с помощью mysqli_set_charset
,
«Отфильтровывание» символов, которые ваша база данных не поддерживает, должно произойти, MySQL просто отбросит эти символы. Если вы хотите сделать это вручную в PHP, вы можете сделать это, чтобы отфильтровать все символы выше U + FFFF:
$string = preg_replace_callback('/./u', function (array $m) {
return strlen($m[0]) > 4 ? null : $m[0];
}, $string);
В целом: поддержка utf8mb4
занимает около двух минут. Вам просто нужно установить кодировку таблицы / столбца в utf8mb4
и сделайте то же самое со своим соединением mysqli. Если вы затем отправляете фактические данные UTF-8 из своего приложения PHP в свою базу данных, вы будете хранить эмодзи очень хорошо.
Других решений пока нет …