2011-01-24 83 views
15

Estoy escribiendo a la base de datos en la forma de datos de un formulario con jQuery json_encode.php json_encode utf8 char problema (mysql)

Sin embargo, los datos de la base de datos se dañarán.

$db->query("SET NAMES utf8"); 

$kelime = array("Merhaba","Dünya"); 
$bilgi = json_encode($kelime); 

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '".$bilgi."' 
"; 
$db->query($incelemeEkle); 

Tabla de la base de datos Esquema;

CREATE TABLE `incelemeRapor` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `bigData` text COLLATE utf8_unicode_ci, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

MySQL Inserted Example Data;

["Merhaba","Du00fcnya"] 
+0

¿Qué codificación guarda el archivo PHP? –

+0

Hola Matt, UTF8 guardado. –

+0

Basado en la documentación de MySQL, el juego de caracteres está entre comillas cuando usa SET NAMES, que parece que no tiene, por lo que es posible que no esté realmente configurando utf8. –

Respuesta

25

escapar siempre los datos antes de que pone en una consulta SQL:

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '".mysql_real_escape_string($bilgi)."' 
"; 

(añadido mysql_real_escape_string() llamada)

json_encode() codifica caracteres no ASCII con la notación \u<code-point>; entonces json_encode(array("Merhaba","Dünya")); devuelve ["Merhaba","D\u00fcnya"].

A continuación, esta cadena es Embebido en una consulta SQL:

INSERT INTO incelemeRapor SET 
bigData = '["Merhaba","D\u00fcnya"]' 

no hay un significado especial para la secuencia de escape \u, por lo MySQL sólo elimina la \; y esto da como resultado que ["Merhaba","Du00fcnya"] se almacene en la base de datos.

Así que si a escapar de la cadena, la consulta se convierte en:

$incelemeEkle = " 
INSERT INTO incelemeRapor SET 
bigData = '["Merhaba","D\\u00fcnya"]' 
"; 

Y ["Merhaba","D\u00fcnya"] se almacena en la base de datos.

-1

Aplicaría la codificación BASE64 a la cadena JSON. Esto debería funcionar con el ajuste de casi todos los php, base de datos, la versión de base de datos y ajuste:

$values = array("Test" => 1, "the" => 2, "West" => 3); 
$encoded = base64_encode(json_encode($values)); 
$decoded = json_decode(base64_decode($encoded), true); 
+0

no es necesario codificar base64 para JSON. Es ASCII seguro. Solo personajes de 7 bits. – bluesmoon

+0

Tienes razón. Pero la codificación de base64 evita cualquier problema con las barras diagonales inversas (u otros caracteres especiales) –

1

Así, además de asegurar que su base de datos está utilizando utf8_unicode_ci, también quiere asegurarse de PHP está utilizando la codificación correcta. Normalmente, ejecuto los dos comandos siguientes en la parte superior de cualquier función que potencialmente tendrá caracteres extraños dentro de ellos. Aún mejor es correr como uno de los primeros comandos cuando su aplicación se inicia:

mb_language('uni'); 
mb_internal_encoding('UTF-8'); 

Esos dos líneas me han salvado un montón de dolores de cabeza!

0

Como dice user576875, solo debe tratar correctamente su cadena antes de insertarla en la base de datos. mysql_real_escape_string() es una forma de hacerlo. Las declaraciones preparadas son otra forma. Esto también lo salvará del problema de seguridad de la inyección SQL del que podría ser susceptible si escribe la entrada del usuario directamente en SQL. Siempre use uno de los dos métodos anteriores.

Además, tenga en cuenta que esto tiene poco que ver con UTF8. JSON es seguro para ASCII, por lo que siempre que utilice un juego de caracteres ASCII (utf8, iso-8859-1), los datos se insertarán y almacenarán correctamente.

0

He intentado con mysql_real_escape_string() pero no funcionó para mí (resultado para el campo vacío en la base de datos).

así que buscamos aquí: http://php.net/manual/fr/json.constants.php y la bandera JSON_UNESCAPED_UNICODE trabajado bien para mí:

$json_data = json_encode($data,JSON_UNESCAPED_UNICODE); 

JSON_UNESCAPED_UNICODE sólo está disponible a partir de PHP 5.4.0!