2010-05-31 16 views
6

Puede alguien explicar cuando me puse todo a UTF-8 Quiero evitar esos malditosUTF-8 juego de caracteres MySQL y

MySQL versión
servidor: 5.1.44
MySQL conjunto de caracteres: UTF-8 Unicode (UTF-8)

puedo crear una nueva base de datos

nombre: utf8test
cotejo: utf8_general_ci
de las conexiones MySQL:utf8_general_ci

My SQL tiene este aspecto:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 

CREATE TABLE IF NOT EXISTS `test_table` (
    `test_id` int(11) NOT NULL, 
    `test_text` text NOT NULL, 
    PRIMARY KEY (`test_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

INSERT INTO `test_table` (`test_id`, `test_text`) VALUES 
(1, 'hééélo'), 
(2, 'wööörld'); 

Mi PHP/HTML:

<?php 
$db_conn = mysql_connect("localhost", "root", "") or die("Can't connect to db"); 
mysql_select_db("utf8test", $db_conn) or die("Can't select db"); 

// $result = mysql_query("set names 'utf8'"); // this works... why?? 
$query = "SELECT * FROM test_table";   
$result = mysql_query($query); 

$output = ""; 
while($row = mysql_fetch_assoc($result)) { 
    $output .= "id: " . $row['test_id'] . " - text: " . $row['test_text'] . "<br />"; 
} 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html lang="it" xmlns="http://www.w3.org/1999/xhtml" xml:lang="it"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>UTF-8 test</title> 
</head> 
<body> 
<?php echo $output; ?> 
</body> 
</html> 

Respuesta

1

puse todo a UTF-8

No

bastante.
Tienes que decirle a mysql la codificación del cliente.

De hecho, no es necesario configurar "todo" en utf-8. Puedes tener tus tablas en latin1 y salir en utf-8. O contrario.
Muy flexible.

Pero tiene que configurar la codificación del cliente explícitamente. Entonces, es por eso que funciona con set names utf8. Porque esta consulta configura la codificación del cliente. Y que Mysql sepa que los datos deben enviarse en utf-8. Muy sensato, ¿eh?

También tengo que mencionar su volcado de SQL. Necesita el mismo ajuste. Simplemente establece NOMBRES en algún lugar en la parte superior. Porque también está enviando estas consultas desde algún cliente. Y la codificación de este cliente también debe configurarse.

Y una cosa más para mencionar: asegúrese de que su servidor envíe la codificación correcta en el encabezado Content-type. No lo configuró para UTF-8 también.

+0

Thanks Col. Ok, déjenme ver ... el volcado de SQL del que están hablando. Aparte de la línea $ result = mysql_query ("set names 'utf8'") en mi ejemplo, tengo hacer otro conjunto de nombres utf8? ¿Dónde y cómo exactamente por favor? – FFish

+0

@FFish el mismo lugar donde ingresa sus comandos sql comenzados desde 'SET SQL_MODE'. ¿es la consola de mysql o qué? es solo una regla simple: cada vez que inserta o selecciona datos, debe establecerse la codificación del cliente. –

+0

ok, el volcado de SQL, ahora veo lo que quieres decir. Aclamaciones – FFish

6

intenta establecer y carentes de codificación después de mysql_connect función como esta:

mysql_query ("set character_set_client='utf8'"); 
mysql_query ("set character_set_results='utf8'"); 

mysql_query ("set collation_connection='utf8_general_ci'"); 
+1

se puede acortar a simple 'SET NAMES utf8' –

+0

Sí, lo sé. Escribo la solución de resolución mysql 4+. – antyrat

+0

4.0 no entiende ninguna de estas configuraciones. Y 4.1 también entienden los nombres de los conjuntos –

1

yo no No verá una consulta "SET NAMES 'utf8';" justo después de conectarse a su base de datos.

Pruébalo, puede que funcione para ti.

0

Desea verificar el juego de caracteres actual usando mysql_client_encoding y cuando sea necesario mysql_set_charset. O simplemente no importa la comprobación y ciegamente vaya con la configuración.

1

diría que se olvida de establecer el tipo de codificación de contenido de su archivo PHP para UTF-8:

header('Content-Type: text/html; charset=utf-8'); 

O es el error de codificación dentro de la base de datos MySQL?

Si tan sólo cargar los datos devuelve los resultados incorrectos, puede utilizar las consultas mencionadas antes o esta línea de código para permitir UTF-8 para consultas:

$mysqli->set_charset('utf8'); 

espero que sea lo que sea necesario.

Cuestiones relacionadas