usando - utf8 php mysql
Cómo mostrar los caracteres UTF-8 en phpMyAdmin? (17)
Tengo mi base de datos configurada correctamente en UTF-8 y estoy tratando con una base de datos que contiene caracteres japoneses. Si selecciono * ... desde la línea de comando mysql, veo correctamente los caracteres japoneses. Al sacar datos de la base de datos y mostrarlos en una página web, los veo correctamente.
Sin embargo, al ver los datos de la tabla en phpMyAdmin, simplemente veo texto basura. es decir.
ç§ã¯æ- ¥ 本æ- ™ ç † ããåãã ããããããããããããããããããããããããããããàààààààààààààààààààààààààààààààààáàààààà
¿Cómo puedo obtener phpMyAdmin para mostrar los caracteres en japonés?
La codificación de caracteres en la página HTML está configurada en UTF-8.
Editar:
He intentado exportar mi base de datos y he abierto el archivo .sql en geany. Los caracteres aún están distorsionados a pesar de que la codificación está configurada en UTF-8. (Sin embargo, hacer un mysqldump de la base de datos también muestra caracteres ilegibles).
El conjunto de caracteres está configurado correctamente para la base de datos y todas las tablas (''latin'' no se encuentra en ninguna parte del archivo)
CREATE DATABASE `japanese` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
He agregado las líneas a my.cnf y reinicié mysql pero no hay cambios. Estoy usando Zend Framework para insertar datos en la base de datos.
Voy a abrir una recompensa por esta pregunta, ya que realmente quiero resolver esto.
1- Abrir archivo:
C:/wamp/bin/mysql/mysql5.5.24/my.ini
2- Busque la entrada [mysqld] y anexe:
character-set-server = utf8
skip-character-set-client-handshake
Toda la vista debería verse así :
[mysqld]
port=3306
character-set-server = utf8
skip-character-set-client-handshake
3- ¡Reinicia el servicio MySQL!
Añadir:
mysql_query("SET NAMES UTF8");
abajo:
mysql_select_db(/*your_database_name*/);
Cambia latin1_swedish_ci
a utf8_general_ci
en phpmyadmin-> table_name-> field_name
Aquí es donde lo encuentras en la pantalla:
Desafortunadamente, phpMyAdmin es una de las primeras aplicaciones de php que hablan con MySQL sobre charset correctamente. Su problema probablemente se debe al hecho de que la base de datos no almacena las cadenas UTF-8 correctas en primer lugar.
Para mostrar correctamente los caracteres en phpMyAdmin, los datos se deben almacenar correctamente en la base de datos. Sin embargo, convertir la base de datos en el juego de caracteres correcto a menudo interrumpe las aplicaciones web que no tienen en cuenta la función relacionada con el juego de caracteres proporcionada por MySQL.
¿Puedo preguntar: es MySQL> versión 4.1? ¿Para qué aplicación web es la base de datos? phpBB? ¿Se migró la base de datos de una versión anterior de la aplicación web o una versión anterior de MySQL?
Mi sugerencia no es para hermano si la aplicación web que está usando es demasiado antigua y no es compatible. Solo convierta la base de datos a UTF-8 real si está seguro de que la aplicación web puede leerlos correctamente.
Editar:
Su MySQL es> 4.1, eso significa que es consciente de los juegos de caracteres. ¿Cuál es la configuración de intercalación de caracteres para su base de datos? Estoy bastante seguro de que está utilizando latin1
, que es el nombre de MySQL para ASCII, para almacenar el texto UTF-8 en ''bytes'' en la base de datos.
Para los clientes insensibles al conjunto de caracteres (es decir, mysql-cli y php-mod-mysql), los caracteres se muestran correctamente ya que se transfieren a / desde la base de datos como bytes. En phpMyAdmin, los bytes se leen y se muestran como caracteres ASCII, ese es el texto basura que parece.
Innumerables horas se habían pasado hace años (¿2005?) Cuando MySQL 4.0 se volvió obsoleto, en muchas partes de Asia. Hay una forma estándar de lidiar con su problema y los datos engullidos:
- Haga una
.sql
seguridad de su base de datos como.sql
- Ábrelo en el editor de texto con capacidad UTF-8, asegúrate de que se vean correctos.
- Busque la
charset collation latin1_general_ci
, reemplaceutf8
porutf8
. - Guarde como un nuevo archivo sql, no sobrescriba su copia de seguridad
- Importe el nuevo archivo, ahora se verá correctamente en phpMyAdmin, y el japonés en su aplicación web se convertirá en un signo de interrogación. Eso es normal.
- Para su aplicación web php que se basa en php-mod-mysql, inserte
mysql_query("SET NAMES UTF8");
después demysql_connect()
, ahora los signos de interrogación desaparecerán. Agregue la siguiente configuración
my.ini
para mysql-cli:# CLIENT SECTION [mysql] default-character-set=utf8 # SERVER SECTION [mysqld] default-character-set=utf8
Para obtener más información sobre charset en MySQL, consulte el manual: http://dev.mysql.com/doc/refman/5.0/en/charset-server.html
Tenga en cuenta que supongo que su aplicación web está usando php-mod-mysql para conectarse a la base de datos (de ahí la función mysql_connect()
), ya que php-mod-mysql es la única extensión que puedo pensar que aún desencadenó el problema A ESTE DÍA .
phpMyAdmin usa php-mod-mysqli para conectarse a MySQL. Nunca aprendí a usarlo porque cambio a frameworks * para desarrollar mis proyectos de php. También te recomiendo que hagas eso.
- Muchos frameworks, por ejemplo CodeIgniter, Zend, usan mysqli o pdo para conectarse a bases de datos. Las funciones mod-mysql se consideran obsoletas porque causan problemas de escalabilidad y rendimiento. Además, no desea vincular su proyecto a un tipo específico de base de datos.
Es realmente sencillo agregar multilenguaje en myphpadmin si tienes garbdata en myphpadmin, solo ve a myphpadmin haz clic en tu base de datos ve a la pestaña de operaciones en la pestaña de operación ve a la sección de intercalación configúralo en utf8_general_ci, después de eso todos tus datos se mostrarán correctamente. un truco simple y fácil
Esta es mi manera de cómo restaurar los datos sin pérdida de latin1 a utf8:
/**
* Fixes the data in the database that was inserted into latin1 table using utf8 encoding.
*
* DO NOT execute "SET NAMES UTF8" after mysql_connect.
* Your encoding should be the same as when you firstly inserted the data.
* In my case I inserted all my utf8 data into LATIN1 tables.
* The data in tables was like ДЕТСКИÐ.
* But my page presented the data correctly, without "SET NAMES UTF8" query.
* But phpmyadmin did not present it correctly.
* So this is hack how to convert your data to the correct UTF8 format.
* Execute this code just ONCE!
* Don''t forget to make backup first!
*/
public function fixIncorrectUtf8DataInsertedByLatinEncoding() {
// mysql_query("SET NAMES LATIN1") or die(mysql_error()); #uncomment this if you already set UTF8 names somewhere
// get all tables in the database
$tables = array();
$query = mysql_query("SHOW TABLES");
while ($t = mysql_fetch_row($query)) {
$tables[] = $t[0];
}
// you need to set explicit tables if not all tables in your database are latin1 charset
// $tables = array(''mytable1'', ''mytable2'', ''mytable3''); # uncomment this if you want to set explicit tables
// duplicate tables, and copy all data from the original tables to the new tables with correct encoding
// the hack is that data retrieved in correct format using latin1 names and inserted again utf8
foreach ($tables as $table) {
$temptable = $table . ''_temp'';
mysql_query("CREATE TABLE $temptable LIKE $table") or die(mysql_error());
mysql_query("ALTER TABLE $temptable CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error());
$query = mysql_query("SELECT * FROM `$table`") or die(mysql_error());
mysql_query("SET NAMES UTF8") or die(mysql_error());
while ($row = mysql_fetch_row($query)) {
$values = implode("'', ''", $row);
mysql_query("INSERT INTO `$temptable` VALUES(''$values'')") or die(mysql_error());
}
mysql_query("SET NAMES LATIN1") or die(mysql_error());
}
// drop old tables and rename temporary tables
// this actually should work, but it not, then
// comment out this lines if this would not work for you and try to rename tables manually with phpmyadmin
foreach ($tables as $table) {
$temptable = $table . ''_temp'';
mysql_query("DROP TABLE `$table`") or die(mysql_error());
mysql_query("ALTER TABLE `$temptable` RENAME `$table`") or die(mysql_error());
}
// now you data should be correct
// change the database character set
mysql_query("ALTER DATABASE DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci") or die(mysql_error());
// now you can use "SET NAMES UTF8" in your project and mysql will use corrected data
}
Esto funciona para mi,
mysqli_query($con, "SET character_set_results = ''utf8'', character_set_client = ''utf8'', character_set_connection = ''utf8'', character_set_database = ''utf8'', character_set_server = ''utf8''");
Hice un poco más de google y encontré this página
El comando no parece tener sentido, pero lo intenté de todos modos:
En el archivo /usr/share/phpmyadmin/libraries/dbi/mysqli.dbi.lib.php al final de la función PMA_DBI_connect()
justo antes de la declaración de return
, agregué:
mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;");
mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;");
¡Y funciona! Ahora veo caracteres japoneses en phpMyAdmin. WTF? ¿Por qué funciona esto?
La función y los nombres de archivo no coinciden con los de las versiones más recientes de phpMyAdmin. Aquí se explica cómo solucionar los nuevos PHPMyAdmins:
Buscar archivo:
phpmyadmin/libraries/DatabaseInterface.php
En función:
public function query
Justo después de la apertura
{
agregue esto:if($link != null){ mysqli_query($link, "SET SESSION CHARACTER_SET_RESULTS =latin1;"); mysqli_query($link, "SET SESSION CHARACTER_SET_CLIENT =latin1;"); }
Eso es. Funciona de maravilla.
La solución más fácil para wamp es: vaya a phpMyAdmin, haga clic en localhost, seleccione latin1_bin para la interconexión de la conexión del servidor, luego comience a crear la base de datos y la tabla
Primero, desde el cliente
mysql> SHOW VARIABLES LIKE ''character_set%'';
Esto te dará algo como
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
donde puede inspeccionar la configuración general para el cliente, conexión, base de datos
Luego, también debe inspeccionar las columnas desde las cuales está recuperando datos con
SHOW CREATE TABLE TableName
e inspeccionando el conjunto de caracteres y la intercalación de los campos CHAR (aunque normalmente las personas no los configuran explícitamente, pero es posible dar CHAR[(length)] [CHARACTER SET charset_name] [COLLATE collation_name]
en CREATE TABLE foo ADD COLUMN foo CHAR ...
)
Creo que he enumerado todas las configuraciones relevantes en el lado de mysql. Si aún se está perdiendo, lea docs finos y tal vez esta question que podría arrojar algo de luz (especialmente sobre cómo pensé que lo hice bien mirando solo al cliente de MySQL en el primer intento).
Si está utilizando PDO, no olvide iniciarlo con UTF8:
$con = new PDO(''mysql:host='' . $server . '';dbname='' . $db . '';charset=UTF8'', $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
(Solo pasé 5 horas para resolver esto, espero que le ahorre a alguien un tiempo precioso ...)
Tuve exactamente el mismo problema. El conjunto de caracteres de la base de datos es utf-8 y la intercalación es utf8_unicode_ci. Pude ver texto Unicode en mi aplicación web, pero los resultados phpMyAdmin y sqldump fueron ilegibles.
Resultó que el problema estaba en la forma en que mi aplicación web se conectaba a MySQL. Me faltaba la bandera de codificación.
Después de que lo arreglé, pude ver los caracteres griegos correctamente tanto en phpMyAdmin como en sqldump, pero perdí todas mis entradas anteriores .
Yo tuve el mismo problema,
Establezca todas las intercalaciones de texto / varchar en phpMyAdmin a utf-8 y en los archivos php agregue esto:
mysql_set_charset ("utf8", $ your_connection_name);
Esto lo resolvió para mí.
la solución para esto puede ser tan fácil como:
- encuentre la función / método de conexión phpmysqladmin
- agregue esto después de que la base de datos esté conectada
$db_conect->set_charset(''utf8'');
phpmyadmin no sigue la conexión MySQL porque define su intercalación adecuada en el archivo de configuración phpmyadmin.
Entonces, si no queremos o si no podemos acceder a los parámetros del servidor, deberíamos obligarlo a enviar resultados en un formato diferente (codificación) compatible con el cliente, es decir, phpmyadmin.
por ejemplo, si tanto la intercalación de la conexión MySQL como el conjunto de caracteres MySQL son utf8, pero phpmyadmin es ISO, solo debemos agregar este antes de cualquier consulta de selección enviada al MYSQL a través de phpmyadmin:
SET SESSION CHARACTER_SET_RESULTS =latin1;
simplemente elimine el comentario de estas líneas en libraries / database_interface.lib.php
if (! empty($GLOBALS[''collation_connection''])) {
// PMA_DBI_query("SET CHARACTER SET ''utf8'';", $link, PMA_DBI_QUERY_STORE);
//PMA_DBI_query("SET collation_connection = ''" .
//PMA_sqlAddslashes($GLOBALS[''collation_connection'']) . "'';", $link, PMA_DBI_QUERY_STORE);
} else {
//PMA_DBI_query("SET NAMES ''utf8'' COLLATE ''utf8_general_ci'';", $link, PMA_DBI_QUERY_STORE);
}
si almacena datos en utf8 sin almacenar el juego de caracteres, no necesita phpmyadmin para volver a convertir la conexión. Esto funcionará