Подтвердить что ты не робот

Использование utf8mb4 с php и mysql

Я прочитал, что mysql >= 5.5.3 полностью поддерживает все возможные символы, если вы используете USER utf8mb4 для определенной таблицы/столбца http://mathiasbynens.be/notes/mysql-utf8mb4

выглядит красиво. Только я заметил, что mb_functions в php нет! Я не могу найти его нигде в списке: http://php.net/manual/en/mbstring.supported-encodings.php

Я не только прочитал, но и сделал тест.

Я добавил данные в таблицу mysql utf8mb4, используя php script, где внутренняя кодировка была установлена ​​в UTF-8: mb_internal_encoding("UTF-8");

и, как и ожидалось, символы выглядят беспорядочно один раз в db.

Любая идея, как я могу заставить php и mysql использовать одну и ту же кодировку (возможно, 4 байта) и по-прежнему иметь ПОЛНУЮ поддержку любого мирового языка?

Также почему utf8mb4 отличается от utf32?

4b9b3361

Ответ 1

MySQL utf8 кодировка не является актуальной UTF-8. Это кодировка, которая похожа на UTF-8, но поддерживает только подмножество того, что поддерживает UTF-8. utf8mb4 является фактическим UTF-8. Это различие - это внутренняя деталь реализации MySQL. Оба выглядят как UTF-8 на стороне PHP. Используете ли вы utf8 или utf8mb4, PHP будет иметь действительный UTF-8 в обоих случаях.

Что нужно сделать, так это то, что для кодировки соединения между PHP и MySQL установлено значение utf8mb4. Если он установлен на utf8, MySQL не будет поддерживать все символы. Вы устанавливаете эту кодировку соединения, используя mysql_set_charset(), параметр подключения PDO charset DSN или любой другой метод, подходящий для вашего API баз данных.


mb_internal_encoding просто устанавливает значение по умолчанию для параметра $encoding для всех функций mb_*. Он не имеет ничего общего с MySQL.

UTF-8 и UTF-32 отличаются тем, как они кодируют символы. UTF-8 использует минимум 1 байт для символа и максимум 4. UTF-32 всегда использует 4 байта для каждого символа. UTF-16 использует минимум 2 байта и максимум 4.
Из-за своей переменной длины UTF-8 имеет немного накладных расходов. Символ, который может быть закодирован в 2 байтах в UTF-16, может принимать 3 или 4 в UTF-8; С другой стороны, UTF-16 никогда не использует менее 2 байтов. Если вы храните много азиатского текста, UTF-16 может использовать меньше хранилища. Если большая часть вашего текста - английский /ASCII, UTF-8 использует меньше памяти. UTF-32 всегда использует большинство хранилищ.

Ответ 2

  • utf-32: это кодировка символов с использованием фиксированных 4 байтов на символы
  • utf-8: это кодировка символов с использованием до 4 байтов на каждый символ, но наиболее частые символы кодируются только 1, 2 или 3 символа.

MySQL utf-8 не поддерживает символы, закодированные более чем на 3 символа, поэтому они добавили utf-8mb4, который действительно является utf-8.

Ответ 3

Перед запуском вашего фактического запроса выполните mysql_query ('SET NAMES utf8mb4')

Также убедитесь, что ваш сервер mysql настроен на использование utf8mb4. Для получения дополнительной информации о том, как, обратитесь к статье: https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4

Ответ 4

Это то, что я использовал, и работал хорошо для моей проблемы, используя знак евро и преобразование для отказа json_encode.

php конфигурации script (api и т.д.)

header('Content-Type: text/html; charset=utf-8');
ini_set("default_charset", "UTF-8");
mb_internal_encoding("UTF-8");
iconv_set_encoding("internal_encoding", "UTF-8");
iconv_set_encoding("output_encoding", "UTF-8");

таблицы mysql/или конкретные столбцы

utf8mb4

mysql PDO connection

$dsn = 'mysql:host=yourip;dbname=XYZ;charset=utf8mb4';

(... ваше соединение...)

перед выполнением запроса (может и не потребоваться):

$dbh->exec("set names utf8mb4");