character_set_name
Aprende a usar mysqli_character_set_name() en PHP para obtener el nombre del juego de caracteres de la conexión MySQL actual.
La función mysqli_character_set_name() devuelve el juego de caracteres predeterminado en uso para la conexión MySQLi actual — por ejemplo utf8mb4, utf8 o latin1. Esta página explica qué devuelve la función, su sintaxis en ambos estilos, cuándo usarla y los problemas de codificación que ayuda a detectar.
Qué controla el juego de caracteres
El juego de caracteres de la conexión le indica a MySQL cómo interpretar los bytes que envías (en sentencias INSERT/UPDATE y parámetros de consulta) y cómo codificar los bytes que devuelve. Si el charset de la conexión no coincide con la codificación real de tus cadenas, obtendrás mojibake — letras acentuadas corruptas, emojis convertidos en ???? y pérdida silenciosa de datos.
mysqli_character_set_name() es la forma más rápida de inspeccionar ese ajuste en tiempo de ejecución. Es un diagnóstico de solo lectura: nunca cambia nada. Para cambiar el charset usa set_charset().
Sintaxis
La función tiene una forma orientada a objetos y una forma procedimental. Son equivalentes — elige la que se ajuste a tu código.
// Object-oriented style
string $mysqli->character_set_name()
// Procedural style
string mysqli_character_set_name(mysqli $mysqli)- Parámetro (solo procedimental):
$mysqli— una conexión devuelta pormysqli_connect()onew mysqli(). - Valor de retorno: un string con el nombre del juego de caracteres actual (p. ej.
"utf8mb4"). No devuelvefalse; en una conexión válida siempre existe un charset.
Cómo usar mysqli_character_set_name()
Llámala sobre una conexión abierta e imprime el resultado:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
echo "Character set: " . $mysqli->character_set_name();
$mysqli->close();
?>Una salida típica, antes de definir nada explícitamente, es el valor predeterminado del servidor:
Character set: utf8mb4Lo mismo en estilo procedimental:
<?php
$mysqli = mysqli_connect("localhost", "your_username", "your_password", "database");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
echo "Character set: " . mysqli_character_set_name($mysqli);
mysqli_close($mysqli);
?>Leer el charset después de cambiarlo
Dado que la función informa el ajuste en tiempo real, resulta útil para confirmar que una llamada a set_charset() realmente surtió efecto:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
echo "Before: " . $mysqli->character_set_name() . "\n";
$mysqli->set_charset("utf8mb4");
echo "After: " . $mysqli->character_set_name() . "\n";
$mysqli->close();
?>Before: latin1
After: utf8mb4Por qué debes establecer el charset en lugar de solo leerlo
mysqli_character_set_name() solo informa el charset — no puede corregirlo. Para soporte completo de Unicode (incluidos emojis y muchos caracteres CJK) establece utf8mb4 justo después de conectarte:
<?php
$mysqli = new mysqli("localhost", "your_username", "your_password", "database");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$mysqli->set_charset("utf8mb4");
$mysqli->query("INSERT INTO users (name, email) VALUES ('Jörg 🚀', '[email protected]')");
$mysqli->close();
?>Notas y advertencias:
- Prefiere
utf8mb4sobreutf8. Elutf8heredado de MySQL es un alias de 3 bytes que no puede almacenar caracteres de 4 bytes como los emojis.utf8mb4es UTF-8 real y completo. - No ejecutes
SET NAMES ...como consulta para cambiar el charset. Actualiza la sesión en el lado del servidor pero deja a la biblioteca cliente sin saberlo, lo que rompereal_escape_string(). Usa siempreset_charset()para que ambos permanezcan sincronizados. - El nombre devuelto corresponde al charset de la conexión, que es independiente del charset de una columna o tabla definido en el esquema.
Funciones relacionadas
mysqli_set_charset()— cambia el juego de caracteres de la conexión.mysqli_get_charset()— obtiene un objeto completo que describe el charset (cotejamiento, longitud en bytes y más).mysqli_connect_errno()/mysqli_connect_error()— detecta fallos de conexión antes de leer el charset.- Resumen de PHP MySQLi — la extensión MySQLi en general.
Conclusión
mysqli_character_set_name() es un diagnóstico pequeño y fiable para confirmar qué juego de caracteres está usando una conexión MySQL. Úsalo para depurar problemas de codificación y luego corrígelos con set_charset("utf8mb4") para que tu aplicación almacene texto acentuado y emojis correctamente.