Dos consultas sobre MySQL

Javier Castrillo riverplatense en gmail.com
Lun Mayo 7 15:04:54 CEST 2007


On 06/05/07, Gabriel Genellina <gagsl-py2 en yahoo.com.ar> wrote:
> > Fijate lo que me llega:
> >
> > <type 'str'> 'Juli\xe1n'
>
> Ah, pero eso no es utf8, sino probablemente iso-8859-1 (latin1) o
> iso-8859-15 o incluso cp1252 (windows). Si fuera utf8 se vería como
> 'Juli\xc2\xa0n'
>

Ya avancé en varias cosas. Por ejemplo ya puedo ver acentos y eñes en
la consola de MySQL, para eso tuve que tocar el archivo de
configuración my.cnf y agregarle las siguientes líneas:

[mysqld]
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_unicode_ci

[client]
default-character-set=utf8

y ahora en la consola de MySQL puedo ver maravillosos acentos y eñes!!!

mysql> SELECT apellidos, nombres FROM alumnos ORDER by apellidos asc;

+-----------------+----------------+
| apellidos       | nombres        |
+-----------------+----------------+
| Castañares      | María Cecilia  |
| García Macías   | José Luis      |
| Nuñez García    | Julián Carlos  |
+-----------------+----------------+

3 rows in set (0.05 sec)

ahora, continúa el problema de python en sí:

Tengo algunos formularios para hacer altas y antes de enviarlos a la
base, les agregué "unicode(loquesea)" y aparentemente va bien porque
el alta se hace y al verlo por consola se ven claritos los acentos y
las eñes.

Peeero, al hacer la consulta luego de esos campos mediante el script
(que les mando debajo de este correo) me tira el siguiente error:

Por ejemplo al probar con apellido  Nuñez García me devuelve:

ascii
None
<type 'str'>
'Juli\xe1n Carlos'
Traceback (most recent call last):
  File "/home/javier/python/wxpython/proyecto_sancabase/probador.py",
line 39, in OnAceptar
    LblQ = wx.StaticText(self.panel, -1, u"Nombre: %s" % q[0][0], (15, 90))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position
4: ordinal not in range(128)

O sea que por lo que me enseñaron en las listas:

sys.getdefaultencoding()

es ASCII y aquí creo que está el problema, que python no tiene a utf8
como defaultencoding

Por lo que busqué cosas tales como setdefaultencoding() o algo así
para poner utf8 como default y no ascii pero no lo encontré por lo que
(por fin) llego a la pregunta.

Cómo seteo el defaultencoding de python a utf8??

Llego a esta conclusión porque la consola está en utf8:

javier en gnutebook:~$ locale charmap
UTF-8

El editor (drpython)está seteado en utf8, archivo incluido:

#!/usr/bin/python
# -*- coding: UTF8 -*-


mysql está en utf8 (completo, server, conexiones, todo. Bases y tablas también):

mysql> show variables like "%character%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.15 sec)

... así que sólo me faltaría que python esté chamuyando en utf8... creo

Muchas gracias por todo, perdón por el correo largo pero me parece que
así como estoy aprendiendo mucho con este tema, al indexar los correos
de la lista, alguien a quien le pase lo mismo ya va a tener alguna
punta más, por lo que trato de documentar lo mejor posible los errores
y las pruebas. Y todo esto demuestra todo lo que se aprende al tratar
de resolver los errores y lo valiosa que es la comunidad en estas
cuestiones.

Gracias de nuevo, va el código que hice para probar las consultas. Saludos

#!/usr/bin/python
# -*- coding: UTF8 -*-

import wx, sys, MySQLdb

class App(wx.App):
	def OnInit(self):
		frame = Frame("Probador", (300, 300), (250, 250))
		frame.Show()
		self.SetTopWindow(frame)
		return True

#Clase Frame
class Frame(wx.Frame):
	def __init__(self, title, pos, size):
		wx.Frame.__init__(self, None, -1, title, pos, size)
		self.panel = wx.Panel(self, -1)
		LblProbando = wx.StaticText(self.panel , -1, 'Apellido: ', (15, 10))
		self.TxClBusqueda = wx.TextCtrl(self.panel, -1, '', (15, 30), (125, -1))
		self.TxClBusqueda.SetFocus()
		self.db = MySQLdb.connect("localhost", "javier", "javier", "escuela")
		boton = wx.Button(self.panel, wx.ID_OK, pos=(60, 150))
		self.Bind(wx.EVT_BUTTON, self.OnAceptar, boton)
		boton2 = wx.Button(self.panel, wx.ID_CANCEL, pos=(160, 150))
		self.Bind(wx.EVT_BUTTON, self.OnBorrar, boton2)
		
	def OnAceptar(self, event):
		self.apellido = unicode(self.TxClBusqueda.GetValue())
		c = self.db.cursor()
		text = wx.StaticText(self.panel, -1, "%s" % self.apellido, (15, 70))
		c.execute("""SELECT nombres FROM alumnos WHERE apellidos = %s""",
(self.apellido,))
		q = c.fetchmany()
		########Para que me tire por consola seteos relevantes
		print sys.getdefaultencoding()
		print sys.stdout.encoding
		print type(q[0][0])
		print repr(q[0][0])
		########	
		LblQ = wx.StaticText(self.panel, -1, u"Nombre: %s" % q[0][0], (15, 90))
	
	def OnBorrar(self, event):
		self.TxClBusqueda.SetValue('')
		
	
if __name__== '__main__':
	app = App()
	app.MainLoop()


-- 
Javier Castrillo

=========================================================
GNU / Linux User #242275

-------------------------------
pub   1024D/B482896F 2006-09-04
uid                  Javier Castrillo (El Palo) <riverplatense en gmail.com>
sub   2048g/52C99A4E 2006-09-04

Clave pública: carapa.com.ar/public.asc
http://carapa.com.ar
http://javiercastrillo.com.ar
http://riverplatense.googlepages.com
=========================================================
Usá Software Libre




Más información sobre la lista de distribución Python-es