2010-12-16 11 views
14

OK, actualmente estoy en PHP/MySQL/UTF-8/Unicode hell!UTF8 emite PHP -> MySQL. Obtener signos de interrogación en la base de datos?

Mi entorno: MySQL: 5.1.53 juego de caracteres del servidor: latin1 Db juego de caracteres: latin1 juego de caracteres Cliente:. Latin1 Conn juego de caracteres: latin1

PHP: 5.3.3

Mis archivos PHP se guardan como formato UTF-8, no como archivos ASCII.

En mi código PHP cuando hago la conexión de base de datos hago lo siguiente:

ini_set('default_charset', 'utf-8'); 
$my_db = mysql_connect(DEV_DB, DEV_USER, DEV_PASS); 
mysql_select_db(MY_DB); 
// I have tried both of the following utf8 connection functions 
// mysql_query("SET NAMES 'utf8'", $my_db); 
mysql_set_charset('utf8', $my_db); 
// Detect if form value is not UTF-8 
if (mb_detect_encoding($_POST['lang_desc']) == 'UTF-8') { 
$lang_description = $_POST['lang_desc']; 
} else { 
$lang_description = utf8_encode($_POST['lang_desc']); 
} 
$language_sql = sprintf(
'INSERT INTO app_languages (language_id, app_id, description) VALUES (%d, %d, "%s")', 
          intval($lang_data['lang_id']), 
          intval($new_app_id), 
          mysql_real_escape_string($lang_description, $my_db) 
); 

El formato/crear de mi base de datos MySQL es:

CREAR TABLA SI NO EXISTE app_languages ( language_id int (10) unsigned NOT NULL, app_id int (10) unsigned NOT NULL, description tinytext collate utf8_unicode_ci, PRIMARY KEY (language_id, app_id) ) ENGINE = MyISAM DEFAULT CHARSET = utf8 COLLATE = utf8_unicode_ci;

Las sentencias SQL que se generan a partir de mi código PHP tener este aspecto:

INSERT INTO app_languages (language_id, app_id, description) VALUES (91, 2055, "阿拉伯体育新闻和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (26, 2055, "阿拉伯體育新聞和信息") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (56, 2055, "בערבית ספורט חדשות ומידע") 
INSERT INTO app_languages (language_id, app_id, description) VALUES (69, 2055, "アラビア語のスポーツニュースと情報") 

Sin embargo, la salida aparece en mi base de datos como este:

|   69 | 2055 | ?????????????????        | 
|   56 | 2055 | ?????? ????? ????? ?????      | 
|   28 | 2055 | Arapski sportske vijesti i informacije   | 
|   42 | 2055 | Arabe des nouvelles sportives et d\'information | 
|   91 | 2055 | ??????????          | 

¿Qué estoy haciendo mal ??

P.S. Podemos usar Putty para SSH directamente en el servidor de la base de datos y a través de la línea de comando Pegar una de las instrucciones de inserción unicode/multilingüe. ¿Y funcionan con éxito?

Gracias por cualquier luz que pueda arrojar sobre esto, me está volviendo loco.

Cheers, Jason

Respuesta

1

La respuesta está en su pregunta. Está utilizando latin1 en toda su base de datos, y no puede manejar unicode. También debe cambiarlos a UTF-8.

+0

No, eso no es correcto porque verás en mis comentarios "PS Podemos usar Putty para SSH directamente en el servidor de la base de datos y a través de la línea de comando Pegar una de las instrucciones de inserción unicode/multilingüe. Y funcionan con éxito !? " – Jason

+0

@Jason ¿Estás seguro de que Putty usa la codificación correcta? http://thegreyblog.blogspot.com/2009/08/configuring-putty-to-use-utf-8.html – bobo

+0

@bobo, sí, así es exactamente como Putty está manejando la codificación, es UTF-8. – Jason

13

tratan de ejecutar la consulta siguiente después de que ha seleccionado el PP:

SET NAMES 'utf8' 

esta consulta debería resolver el problema con diferentes juegos de caracteres en sus archivos y el PP.

Felix

+1

Muchas gracias. Tu respuesta resolvió mi problema grave. –

+0

buena respuesta. Tuve el mismo problema, así que resolvió mi problema. muchas gracias – ako

0
//first make sure your file produce utf-8 chars 
header('Content-Type: text/html; charset=utf-8'); 
0

mb_detect_encoding es bastante inútil a menos que ya sabe lo que está tratando. Probablemente no deberías confiar en él a menos que especifiques el segundo y el tercer argumento. Actualmente, probablemente no devuelva lo que crees que hace.

0

Veo que las palabras que viste como ??????? son palabras en árabe ..el cual debe tener una colación

cp1256_general_ci 

no

UTF-8_general_ci 

cambio de eso, se puede resolver el problema.

Cuestiones relacionadas