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

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

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

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

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

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

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

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

Кодировка 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() , параметр подключения DSN- charset PDO или любой другой метод, подходящий для вашего 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 всегда использует большую часть хранилища.

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

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

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

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

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

скрипт конфигурации php (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 

Соединение с PDO mysql

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

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

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

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