PHP 8.5.0 Alpha 2 available for testing

Juegos de caracteres

Idealmente, un juego de caracteres adecuado debe ser definido a nivel del servidor, operación descrita en la sección » Configuración del juego de caracteres del manual del servidor MySQL. Alternativamente, cada API MySQL ofrece un método para definir el juego de caracteres durante la ejecución.

Precaución

El juego de caracteres y el escape de caracteres

El juego de caracteres debe ser comprendido y definido, sabiendo que tiene un efecto en cada acción, y tiene implicaciones a nivel de seguridad. Por ejemplo, el mecanismo de escape (i.e. mysqli_real_escape_string() para mysqli, y PDO::quote() para PDO_MySQL) utilizará esta configuración. Es importante tener en cuenta que estas funciones no utilizarán el juego de caracteres definido con una consulta, por lo tanto, el ejemplo siguiente no tendrá ningún efecto sobre el juego de caracteres:

Ejemplo #1 Problemas al definir el juego de caracteres con SQL

<?php

$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

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

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

// Pero esto afectará $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');

// Pero esto NO lo afectará (UTF-8 en comparación con utf8mb4) -- no utilice guiones aquí
$mysqli->set_charset('UTF-8');
?>

A continuación, los ejemplos que demuestran cómo modificar correctamente el juego de caracteres durante la ejecución utilizando cada una de las APIs.

Nota: Confusión posible con UTF-8

Debido a que los nombres de los juegos de caracteres en MySQL no contienen guiones, la cadena "utf8" es correcta en MySQL y definirá el juego de caracteres en UTF-8. La cadena "UTF-8" no es correcta, y utilizar "utf-8" fallará al modificar el juego de caracteres.

Ejemplo #2 Ejemplo de definición del juego de caracteres: mysqli

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

echo
'Juego de caracteres inicial: ' . $mysqli->character_set_name() . "\n";

if (!
$mysqli->set_charset('utf8mb4')) {
printf("Error al cargar el juego de caracteres utf8mb4: %s\n", $mysqli->error);
exit;
}

echo
'Su juego de caracteres actual es: ' . $mysqli->character_set_name() . "\n";
?>

Ejemplo #3 Ejemplo de definición del juego de caracteres: pdo_mysql

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>
add a note

User Contributed Notes 1 note

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
To Top