W3docs

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().

Практика

Практика
Что делает функция " `mb_internal_encoding()` в PHP?
Что делает функция " `mb_internal_encoding()` в PHP?
Was this page helpful?