UTF-8 no funciona cuando se conecta a la base de datos MySQL en Python -- python campo con mysql campo con encoding campo con utf-8 campo con mysql-python camp Relacionados El problema

UTF-8 not working when connecting to MySQL database in Python


0
vote

problema

Español

Estoy luchando para hacer que Python Play sea agradable con mi base de datos MySQL codificada UTF-8 que contiene, por ejemplo, los caracteres noruegos, æøå . He buscado durante horas, pero no he podido encontrar nada que funcione como se esperaba. Aquí hay una tabla de ejemplo extraída de la base de datos:

  mysql> select * from my_table; +----+-----------------+ | id | shop_group_name | +----+-----------------+ |  1 | Frukt og grønt  | |  2 | Kjøtt og fisk   | |  3 | Meieriprodukter | |  4 | Frysevarer      | |  5 | Bakevarer       | |  6 | Tørrvarer       | |  7 | Krydder         | |  8 | Hermetikk       | |  9 | Basisvarer      | | 10 | Diverse         | +----+-----------------+ 10 rows in set (0.00 sec)   

Por lo tanto, los datos son definitivamente la codificación UTF-8. Sin embargo, al ejecutar el siguiente código de Python, no le da la salida INT UTF-8. ¿Qué podría estar mal con eso? No tiene nada que ver con el cremallera; Las tuplas devueltas por cursor.execute(query) ya han desordenado la codificación.

  #!/usr/bin/env python import MySQLdb  db = MySQLdb.connect(host="localhost",                      user="test",                      passwd="passwd",                      db="mydb",                      charset='utf8',                      use_unicode=True)  # Set desired conversion of data. db.converter[MySQLdb.FIELD_TYPE.NEWDECIMAL] = float db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.LONGLONG] = int db.converter[MySQLdb.FIELD_TYPE.LONG] = int db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str  cursor = db.cursor() query = 'SELECT * FROM my_table'  allResults = {} cursor.execute(query) columns = [desc[0] for desc in cursor.description] rows = cursor.fetchall() results = [] for row in rows:     row = dict(zip(columns, row))     results.append(row) allResults['my_table'] = results  cursor.close() db.close()   

El diccionario allResults6 ahora contiene:

  {     'my_table': [         {             'id': 1,             'shop_group_name': 'Fruktoggrxf8nt'         },         {             'id': 2,             'shop_group_name': 'Kjxf8ttogfisk'         },         {             'id': 3,             'shop_group_name': 'Meieriprodukter'         },         {             'id': 4,             'shop_group_name': 'Frysevarer'         },         {             'id': 5,             'shop_group_name': 'Bakevarer'         },         {             'id': 6,             'shop_group_name': 'Txf8rrvarer'         },         {             'id': 7,             'shop_group_name': 'Krydder'         },         {             'id': 8,             'shop_group_name': 'Hermetikk'         },         {             'id': 9,             'shop_group_name': 'Basisvarer'         },         {             'id': 10,             'shop_group_name': 'Diverse'         }     ] }   

realmente no puedo ver lo que estoy haciendo mal. Estoy ejecutando las pruebas en Python 2.7.6 en Ubuntu.

Actualización

(Cambio de tablas a UTF-8)

Intenté cambiar las tablas a UTF-8, volteando la base de datos y cambiando el conjunto de caracteres y la recopilación en el archivo de volcado y luego insertándolo en una nueva base de datos. Por ejemplo, esta parte del archivo de volcado corresponde al ejemplo anterior. Así es como fue:

  DROP TABLE IF EXISTS `my_table`; /*!40101 SET @saved_cs_client     = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `my_table` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `shop_group_name` varchar(100) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */;   

y esto es lo que cambié esta parte a:

  DROP TABLE IF EXISTS `my_table`; /*!40101 SET @saved_cs_client     = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `my_table` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `shop_group_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;   

Sin embargo, esto todavía no funciona. La salida sigue siendo la misma que la anterior. Correr <form method="post" action=""> <input type="text" name="generator"/> <input type="submit" name="generatingsubmit"/> </form> <?php if(isset($_POST['generator'])){ $generator = $_POST['generator']; echo "<form method='post' action=''>"; for($i = 0; $i < $generator; $i++){ echo "<input type='text' name='" . $i ."'/>"; } echo "<input type='submit' name='submit'/>"; echo "</form>"; } echo $_POST[$i]; ?> 0 Ahora produce <form method="post" action=""> <input type="text" name="generator"/> <input type="submit" name="generatingsubmit"/> </form> <?php if(isset($_POST['generator'])){ $generator = $_POST['generator']; echo "<form method='post' action=''>"; for($i = 0; $i < $generator; $i++){ echo "<input type='text' name='" . $i ."'/>"; } echo "<input type='submit' name='submit'/>"; echo "</form>"; } echo $_POST[$i]; ?> 1111 .

Original en ingles

I am struggling to make Python play nice with my UTF-8 encoded MySQL database containing, for example, the Norwegian characters, xc3xa6xc3xb8xc3xa5. I have searched around for hours, but have not been able to find anything that works as expected. Here is an example table extracted from the database:

mysql> select * from my_table; +----+-----------------+ | id | shop_group_name | +----+-----------------+ |  1 | Frukt og grxc3xb8nt  | |  2 | Kjxc3xb8tt og fisk   | |  3 | Meieriprodukter | |  4 | Frysevarer      | |  5 | Bakevarer       | |  6 | Txc3xb8rrvarer       | |  7 | Krydder         | |  8 | Hermetikk       | |  9 | Basisvarer      | | 10 | Diverse         | +----+-----------------+ 10 rows in set (0.00 sec) 

So the data is definitely UTF-8 encoded. When running the below Python code, however, it does not give the output int UTF-8. What could be wrong with it? It has nothing to do with the zipping; the tuples returned by cursor.execute(query) has already messed up the encoding.

#!/usr/bin/env python import MySQLdb  db = MySQLdb.connect(host="localhost",                      user="test",                      passwd="passwd",                      db="mydb",                      charset='utf8',                      use_unicode=True)  # Set desired conversion of data. db.converter[MySQLdb.FIELD_TYPE.NEWDECIMAL] = float db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.LONGLONG] = int db.converter[MySQLdb.FIELD_TYPE.LONG] = int db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str db.converter[MySQLdb.FIELD_TYPE.DATETIME] = str  cursor = db.cursor() query = 'SELECT * FROM my_table'  allResults = {} cursor.execute(query) columns = [desc[0] for desc in cursor.description] rows = cursor.fetchall() results = [] for row in rows:     row = dict(zip(columns, row))     results.append(row) allResults['my_table'] = results  cursor.close() db.close() 

The allResults dictionary now contains:

{     'my_table': [         {             'id': 1,             'shop_group_name': 'Fruktoggr\xf8nt'         },         {             'id': 2,             'shop_group_name': 'Kj\xf8ttogfisk'         },         {             'id': 3,             'shop_group_name': 'Meieriprodukter'         },         {             'id': 4,             'shop_group_name': 'Frysevarer'         },         {             'id': 5,             'shop_group_name': 'Bakevarer'         },         {             'id': 6,             'shop_group_name': 'T\xf8rrvarer'         },         {             'id': 7,             'shop_group_name': 'Krydder'         },         {             'id': 8,             'shop_group_name': 'Hermetikk'         },         {             'id': 9,             'shop_group_name': 'Basisvarer'         },         {             'id': 10,             'shop_group_name': 'Diverse'         }     ] } 

I cannot really see what I am doing wrong. I am running the tests in Python 2.7.6 in Ubuntu.

Update (changing tables to UTF-8)

I tried changing the tables to UTF-8 by dumping the database and changing the character set and collation in the dump file and then inserting it into a new database. For example, this part of the dump file corresponds to the example above. This is how it was:

DROP TABLE IF EXISTS `my_table`; /*!40101 SET @saved_cs_client     = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `my_table` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `shop_group_name` varchar(100) DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; 

And this is what I changed this part to:

DROP TABLE IF EXISTS `my_table`; /*!40101 SET @saved_cs_client     = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `my_table` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `shop_group_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; 

However, this is still not working. The output is still the same as above. Running SELECT CHARACTER_SET_NAME FROM information_schema.columns WHERE TABLE_NAME = 'my_table'; now produces utf8.

              
   
   

Lista de respuestas

0
 
vote

Cuando crea su tabla, cree sus columnas en UTF-8:

  CREATE TABLE my_table (     ...     shop_group_name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci );   

Si no especifica el conjunto de caracteres y la recopilación, entonces MySQL usa valores predeterminados para el conjunto de caracteres y la colación. Alternativamente, puede configurar los valores predeterminados en mysql.cnf .

 

When you create your table, create your columns in UTF-8:

CREATE TABLE my_table (     ...     shop_group_name VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci ); 

If you don't specify the character set and collation, then MySQL uses defaults for character set and collation. Alternatively, you can set the defaults in mysql.cnf.

 
 
   
   

Relacionados problema

3  Mysqldb no puede resolver localhost  ( Mysqldb cannot resolve localhost ) 
He establecido una base de datos transaccional básica usando MySQL. Usando Python / MySQLDB, esto funciona bien: connection = MySQLdb.connect (host = "127....

1  Importando MySQLDB y `GLIBC_2.14 'no encontrado  ( Importing mysqldb and glibc 2 14 not found ) 
tratando de ejecutar un script de Python que importa MySQLDB. He corrido yum update libgcrypt . Traceback (most recent call last): File "/var/www/python...

0  El código de Python, la lectura del puerto y el almacenamiento en DB, da error: # 1062, entrada duplicada 1 para la clave primaria  ( Python code reading from port and storing in db gives error 1062 duplicate en ) 
Uso de PYSERIAL, recibo datos de un sensor enchufado al puerto USB. Estoy tratando de almacenar los datos, usando MySQLDB, en una base de datos. cur = db.c...

-1  ¿Cómo corregir la geometría de polígono incompleta e insertar en MySQL?  ( How to correct the incomplete polygon geometry and insert in mysql ) 
Cuando ejecute el código de abajo, obtengo el error (3037, 'Los datos de GIS no válidos se proporcionan para funcionar ST_POLYFROMTEXT') . ¡Vi otra publicaci...

1  Inserte un montón de productos OpenCart Script  ( Insert a lot of products opencart script ) 
Tengo un guión en Python en el que tengo todos mis productos, descripciones, imágenes, etc. Ahora quiero insertar toda esta información en mi tema de Opencart...

0  Python MySQLDB - Consulta de exportación a CSV sin terminadores de línea  ( Python mysqldb export query to csv without line terminators ) 
Básicamente, estoy usando las imágenes de la consulta MySQLDB de mis tablas y quiero guardarlas en .csv, pero uno de los campos tiene terminadores de línea ( ...

75  "No se puede abrir Incluir archivo: 'config-win.h': No hay dicho archivo o directorio" Mientras instala MySQL-Python  ( Cannot open include file config win h no such file or directory while inst ) 
Estoy tratando de instalar MySQL-Python en un VirtualEnv usando PIP en Windows. Al principio, recibí el mismo error reportado aquí , Pero la respuesta allí f...

2  ¿Cómo instalar Python-MySqlDB para Python 2.7 en Ubuntu 20.04 (Focal Fossa)?  ( How to install python mysqldb for python 2 7 in ubuntu 20 04 focal fossa ) 
He intentado "Apt-Get instale Python-MySqldb" que resulta en: root@ps1svr:~# apt-get install python-mysqldb Reading package lists... Done Building dependen...

6  ¿Por qué chino confuso cuando usa Webpy pero es normal cuando usa MySQLDB?  ( Why chinese garbled when use webpy but its normal when use mysqldb ) 
He creo una base de datos en MySQL y use WebPy para construir mi servidor web. Pero es tan extraño para el carácter chino entre los comportamientos de WebPy...

7  Error: comando 'cc' falló con el estado de salida 1 - Instalación de MySQLDDB en Mac  ( Error command cc failed with exit status 1 mysqldb installation on mac ) 
Soy nuevo en Mac y estoy tratando de instalar MySQLDB para Python en Mac, pero después de seguir los pasos mencionados en http: //www.tutorialspoint.com/pyth...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos