get_charset
Функция mysqli_get_charset() в PHP возвращает кодировку соединения с базой данных MySQL — имя, сортировку и лимиты байт.
Функция mysqli_get_charset() возвращает кодировку, которую PHP использует для данного соединения с MySQL, — например utf8mb4, latin1 или utf8. Знать активную кодировку важно, потому что именно она определяет, как текст кодируется при обмене между PHP и MySQL: неверная кодировка превращает буквы с диакритикой, эмодзи и символы нелатинских алфавитов в кашу «мокибаке» и является классической причиной появления символов ? в сохранённых данных.
В этой статье объясняется, что возвращает функция, как читать каждое поле результата и в каких практических ситуациях её стоит вызывать.
Синтаксис
mysqli_get_charset(mysqli $mysql): ?objectВ объектно-ориентированном стиле та же функция доступна как метод $mysqli->get_charset().
$mysql— соединение, возвращённое функциейmysqli_connect().- Возвращаемое значение — object типа
stdClass, описывающий кодировку соединения, илиnull, если кодировку определить не удалось.
Что содержит возвращаемый object
В отличие от функций, возвращающих простую строку, mysqli_get_charset() возвращает object с несколькими полями. Наиболее полезные из них:
| Свойство | Значение |
|---|---|
charset | Название кодировки, например utf8mb4. |
collation | Правило сортировки, например utf8mb4_general_ci. |
dir | Каталог кодировки (в современных сборках обычно пустой). |
min_length | Минимальное количество байт на символ. |
max_length | Максимальное количество байт на символ (4 для utf8mb4). |
number | Внутренний идентификатор кодировки MySQL. |
state | Внутренние флаги состояния кодировки. |
Базовое использование
Вызовите функцию с действующим соединением и прочитайте свойство charset:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
if (mysqli_connect_errno()) {
die("Connection failed: " . mysqli_connect_error());
}
$charset = mysqli_get_charset($mysqli);
printf("Character set: %s\n", $charset->charset); // e.g. utf8mb4
printf("Collation: %s\n", $charset->collation); // e.g. utf8mb4_general_ci
mysqli_close($mysqli);
?>Подключаемся с помощью mysqli_connect(), проверяем ошибку соединения, затем читаем поля charset и collation из возвращённого object.
Объектно-ориентированный стиль
Если вы предпочитаете OOP-интерфейс mysqli, используйте метод get_charset():
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
$charset = $mysqli->get_charset();
echo "Charset: {$charset->charset}\n";
echo "Max bytes: {$charset->max_length}\n"; // 4 for utf8mb4
$mysqli->close();
?>Когда это используется?
- Отладка проблем с кодировкой. Когда сохранённый текст отображается как
?или искажённые символы, проверка кодировки соединения — первый диагностический шаг. - Проверка, что вызов
set_charset()применился. После вызоваmysqli_set_charset()можно прочитать кодировку обратно, чтобы убедиться, что изменение вступило в силу. - Ветвление по ширине байта. Чтение
max_lengthпозволяет узнать, может ли соединение хранить 4-байтовые символы, например эмодзи (utf8mb4), или только до 3 байт (utf8).
Получить только имя
Если вам нужно только имя кодировки, а не весь object, функция mysqli_character_set_name() возвращает его сразу в виде строки:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
echo $mysqli->character_set_name(); // e.g. utf8mb4
$mysqli->close();
?>Распространённые ошибки
- Не путайте с переменной MySQL
character_set_client. Эта функция сообщает о кодировке, которую PHP использует для общения с сервером; она не изменяет то, как столбцы хранят данные — это определяется определением таблицы и столбца. - Задавайте кодировку явно. Полагаться на умолчания сервера ненадёжно в разных окружениях. Вызывайте
mysqli_set_charset($mysqli, "utf8mb4")сразу после подключения — тогдаmysqli_get_charset()должна сообщитьutf8mb4. - Обращение к свойствам
null. Если соединение не установлено, функция может вернутьnull; чтение->charsetуnullвызывает предупреждение. Всегда сначала проверяйте соединение.
Заключение
mysqli_get_charset() возвращает object, описывающий кодировку соединения MySQLi — её имя, правило сортировки и лимиты байт. Используйте её для диагностики проблем с кодировкой и для проверки того, что mysqli_set_charset() применился ожидаемым образом. Если нужно только имя, воспользуйтесь mysqli_character_set_name().