especiales - utf8 php mysql
ESTABLECER NOMBRES utf8 en MySQL? (8)
¡Gracias a todos!
no use: consulta ("ESTABLECER NOMBRES utf8"); esto es cosas de configuración y no una consulta. ponerlo justo después de un inicio de conexión con setCharset () (o método similar)
algo pequeño en la parctice:
estado:
- servidor mysql por defecto habla latin1
- tu aplicación de hoyo está en utf8
- la conexión se realiza sin ningún extra (así: latin1) (sin SET NAMES utf8 ..., no set_charset () método / función)
Almacenar y leer datos no es problema ya que mysql puede manejar los caracteres. si miras en el archivo db ya verás que hay basura en él (por ejemplo, usando phpmyadmin).
hasta ahora esto no es un problema! (incorrecto pero funciona a menudo (en Europa)) ..
..a menos que otro cliente / programa o una biblioteca modificada, que funciona correctamente, leerá / guardará datos. entonces estás en un gran problema!
A menudo veo algo similar a esto a continuación en scripts PHP usando MySQL
query("SET NAMES utf8");
Nunca tuve que hacer esto para ningún proyecto, así que tengo un par de preguntas básicas al respecto.
- ¿Esto es algo que se hace solo con PDO?
- Si no es una PDO específica, ¿cuál es el propósito de hacerlo? Me doy cuenta de que está configurando la codificación para mysql pero quiero decir, nunca he tenido que usarla así que ¿por qué querría usarla?
Del manual :
SET NAMES indica qué conjunto de caracteres usará el cliente para enviar declaraciones SQL al servidor.
Más elaboradamente, (y una vez más, extraído gratuitamente del manual ):
SET NAMES indica qué conjunto de caracteres usará el cliente para enviar declaraciones SQL al servidor. Por lo tanto, SET NAMES ''cp1251'' le dice al servidor, "futuros mensajes entrantes de este cliente están en el juego de caracteres cp1251." También especifica el conjunto de caracteres que el servidor debe usar para enviar los resultados al cliente. (Por ejemplo, indica qué conjunto de caracteres usará para los valores de columna si usa una instrucción SELECT).
En lugar de hacer esto a través de una consulta SQL, use la función php: mysqli :: set_charset mysqli_set_charset
Note: This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.
Consulte la sección de conceptos del conjunto de caracteres de MySQL para obtener más información.
Esta consulta debe escribirse antes de la consulta que crea o actualiza datos en la base de datos, esta consulta se ve así:
mysql_query("set names ''utf8''");
Tenga en cuenta que debe escribir la codificación que está utilizando en el encabezado, por ejemplo, si está usando utf-8, lo agrega de esta manera en el encabezado o se solucionará un problema con Internet Explorer.
para que tu página se vea así
<html>
<head>
<title>page title</title>
<meta charset="UTF-8" />
</head>
<body>
<?php
mysql_query("set names ''utf8''");
$sql = "INSERT * FROM ..... ";
mysql_query($sql);
?>
</body>
<html>
La solucion es
$conn->set_charset("utf8");
No solo PDO. Si sql responde como ''????'' símbolos, preestablecidos de su juego de caracteres (espero UTF-8) realmente recomendados:
if (!$mysqli->set_charset("utf8"))
{ printf("Can''t set utf8: %s/n", $mysqli->error); }
o mediante el estilo de procedimiento mysqli_set_charset($db,"utf8")
Obtener la codificación correcta es realmente complicado: hay demasiadas capas:
- Navegador
- Página
- PHP
- MySQL
El comando SQL "SET CHARSET utf8" de PHP asegurará que el lado del cliente (PHP) obtendrá los datos en utf8, sin importar cómo estén almacenados en la base de datos. Por supuesto, deben almacenarse correctamente primero.
Definición DDL vs. datos reales
La codificación definida para una tabla / columna realmente no significa que los datos están en esa codificación. Si tiene una tabla definida como utf8
pero almacenada como codificación diferente, MySQL la tratará como utf8
y utf8
problemas. Lo que significa que tienes que arreglar esto primero.
Qué verificar
Debe verificar qué codificación tiene el flujo de datos en cada capa.
- Compruebe encabezados HTTP, encabezados.
- Verifique lo que realmente se envía en el cuerpo de la solicitud.
- No olvide que MySQL tiene codificación en casi todas partes:
- Base de datos
- Mesas
- Columnas
- Servidor como un todo
- Cliente
Asegúrate de que esté el correcto en todas partes.
Conversión
Si recibe datos en, por ejemplo, windows-1250
, y desea almacenar en utf-8
, entonces use este SQL antes de almacenar:
SET NAMES ''cp1250'';
Si tiene datos en DB como windows-1250
y quiere utf8
, use:
SET CHARSET ''utf8'';
Última nota:
No confíe en herramientas demasiado "inteligentes" para mostrar los datos. Por ejemplo, phpMyAdmin does (estaba haciendo cuando lo estaba usando) la codificación realmente mala. Y pasa por todas las capas, por lo que es difícil de descubrir. Además, Internet Explorer tuvo un comportamiento realmente estúpido de "adivinar" la codificación basada en reglas extrañas. Use editores simples donde puede cambiar la codificación. Además, recomiendo MySQL Workbench.
Se necesita siempre que desee enviar datos al servidor con caracteres que no se pueden representar en ASCII puro, como ''ñ'' o ''ö''.
Eso si la instancia de MySQL no está configurada para esperar la codificación UTF-8 por defecto de las conexiones del cliente (muchas lo son, dependiendo de su ubicación y plataforma).
Lea http://www.joelonsoftware.com/articles/Unicode.html en caso de que no sepa cómo funciona Unicode.
Lea si se debe usar "ESTABLECER NOMBRES" para ver las alternativas de SET NAMES y de qué se trata exactamente.