Я прочитал, что 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 всегда использует большую часть хранилища.
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");