Conjuntos de caracteres

De forma ideal, un conjunto de caracteres apropiado será establecido a nivel del servidor, que está descrito dentro de la sección » Configuración del conjunto de caracteres del manual del Servidor MySQL. De forma alternativa, cada API de MySQL ofrece métodos para establecer el conjunto de caracteres en tiempo de ejecución.

Precaución

El conjunto de caracteres y el escape de caracteres

El conjunto de caracteres debería entenderse y ser definido, ya que afecta a cada acción, e incluye implicaciones de seguridad. Por ejemplo, el mecanismo de escape (p.ej., mysqli_real_escape_string() para mysqli, mysql_real_escape_string() para mysql, y PDO::quote() para PDO_MySQL) cumplirá con esta configuración. Es importante darse cuenta que estas funciones no usarán el conjunto de caracteres que está definido en una consulta, por lo que, por ejemplo, lo siguiente no tendrá efecto sobre ellas:

Ejemplo #1 Problemas al establecer el conjunto de caracteres con SQL

<?php

$mysqli
= new mysqli("localhost", "mi_usuario", "mi_contraseña", "world");

// NO afectará a $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8");

// NO afectará a $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8");

// Pero esto sí afectará a $mysqli->real_escape_string();
$mysqli->set_charset('utf8'));

// Y esto NO le afectará (utf-8 frente a utf8) -- no emplee guiones aquí
$mysqli->set_charset('utf-8');
?>

Abajo hay ejemplos que demuestran cómo alterar adecuadamente el conjunto de caracteres en tiempo de ejecución usando cada API.

Nota: Posible confusión con UTF-8

Debido a que los nombres de los conjuntos de caracteres no contienen guiones, la cadena "utf8" es válida en MySQL para establecer el conjunto de caracteres a UTF-8. La cadena "utf-8" no es válida para cambiar el conjunto de caracteres.

Ejemplo #2 Ejemplo para establecer el conjunto de caracteres: mysqli

<?php
$mysqli
= new mysqli("localhost", "mi_usuario", "mi_contraseña", "world");

printf("Conjunto de caracteres inicial: %s\n", $mysqli->character_set_name());

if (!
$mysqli->set_charset('utf8')) {
printf("Error cargando el conjunto de caracteres utf8: %s\n", $mysqli->error);
exit;
}

echo
"Información del nuevo conjunto de caracteres:\n";
print_r( $mysqli->get_charset() );

?>

Ejemplo #3 Ejemplo para establecer el conjunto de caracteres: pdo_mysql

Nota: Sólo funciona a partir de PHP 5.3.6.

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world;charset=utf8", 'mi_usuario', 'mi_contraseña');
?>

Ejemplo #4 Ejemplo para establecer el conjunto de caracteres: mysql

<?php
$conexión
= mysql_connect("localhost", "mi_usuario", "mi_contraseña");
$bd = mysql_select_db("world");

echo
'Conuunto de caracteres inicial: ' . mysql_client_encoding($conexión) . "\n";

if (!
mysql_set_charset('utf8', $conexión)) {
echo
"Error: No se pudo establecer el conjunto de caracteres.\n";
exit;
}

echo
'El conjunto de caracteres actual es: ' . mysql_client_encoding($conexión);
?>
add a note

User Contributed Notes 2 notes

up
22
mkroese at eljakim dot nl
7 years ago
Please note that MySQL's utf8 encoding has a maximum of 3 bytes and is unable to encode *all* unicode characters.

If you need to encode characters beyond the BMP (Basic Multilingual Plane), like emoji or other special characters, you will need to use a different encoding like utf8mb4 or any other encoding supporting the higher planes. Mysql will discard any characters encoded in 4 bytes (or more).

See https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html for more information on the matter
up
-1
legrand dot jeremie at gmail dot com
2 years ago
After setting the charset, you should define the 'collation' too, to give information on how sorting results on requests. By default, it is 'utf8mb4_general_ci', which is a simplified set of sorting rules. For the official rules, edicted by Unicode, it should be 'utf8mb4_unicode_ci'.

For example:
\mysqli_set_charset($hdl, 'utf8mb4');
\mysqli_query($hdl, 'SET collation_connection = utf8mb4_unicode_520_ci');
To Top