Можно ли использовать utf8_decode для всего оператора SQL, чтобы избежать проблем с utf-8 / utf8mb4?

У меня есть сайт, который принимает основанные на форме входные данные от пользователей и сохраняет их в базе данных 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..."

2

Решение

Некоторые факты:

  • многие эмодзи находятся выше BMP (базовая многоязычная плоскость) в Unicode, то есть выше кодовой точки U + FFFF
  • MySQL, utf8 charset может представлять только BMP, это на самом деле не полный UTF-8 (ура MySQL)
  • для полной поддержки Unicode MySQL имеет utf8mb4
  • не должно быть реальной ошибки при попытке сохранить символы выше BMP в 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 в свою базу данных, вы будете хранить эмодзи очень хорошо.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]