[python] Unicode v databazi utf8

Petr Messner petr.messner na gmail.com
Neděle Leden 18 15:30:43 CET 2009


Ahoj,

execute("sql prikaz a v nem %s" % promennaOdUZivatele) neni osetreno
proti stavu, kdy v promenne budou apostrofy, natoz proti SQL
injection. Vola se to takto: execute("sql prikaz a v nem %s",
promennaOdUZivatele). Ono si to tu operaci "%" (cili naformatovani
nebo jak to chceme nazyvat) provede samo a zaroven to odescapuje
nebezpecne znaky. Viz prislusne PEP, tusim ze je to PEP 249.

Mimochodem, informace o kodovani se da dat uz funkci MySQLdb.connect.
Databaze pak pracuje s a vraci unicode (tam kde je to relevantni).
conn.set_character_set() mozna dela to same, nevim.

Problem je, ze '\xa1[' neni validni retezec v kodovani UTF-8. Proto
nefunguje x.decode(). MySQL to mozna take neumi prevest do utf-8,
pokud to neukladas do blobu, ale do napr. textoveho sloupce s
kodovanim utf8, i kdyz ve tvem pripade je to spis tim, ze v c.execute
pouzivas operator %, jak jsem jiz psal, a tudiz problem s prevodem do
utf-8 je uz na strane Pythonu/db ovladace.

Snad jsem nic nepopletl, vyzkousel jsem si to :) Zdravim,

PM

Predpokladam, ze pracujeme v Python 2.x.

2009/1/18 Ondrej Beranek <rainbof na gmail.com>:
> Tak jsem se dostal ve svem putovani Py svetem k dalsi zahade.
>
> pokousim se provest zapis do tabulky ovsem pokud string obsahuje nejake
> nevhodne znaky tak se to neprovede a prevest mi to proste nejde.
>
> provadim toto:
>
> import _mysql
> import MySQLdb
>
> conn = MySQLdb.connect (host = "localhost",
>                         user = "root",
>                         passwd = "",
>                         db = "databaze")
>
> conn.set_character_set('utf8')
> spojeni = conn.cursor ()
> x='url=\xa1[img'
>
> spojeni.execute("UPDATE databaze.phpbb3_posts SET post_text = '%s' WHERE
> phpbb3_posts.post_id =637797 LIMIT 1 ;"%x)
> spojeni.close()
>
> a zde dostanu hlaseni
> "Warning: Incorrect string value: '\xA1[img' for column 'post_text' at row
> 1"
> coz mi teda neni jasne string jako string. navic toto jsem z db prve precetl
> a ted to potrebuju jen vratit zpet na puvodni misto ve tvaru v jakem to tam
> bylo.
>
> No rekneme ze tedy neni slusne do databaze cpat unicode ovsem ono to spadne
> i u prevodu
>
> print x.decode('utf-8')
>
> mi zakrici: UnicodeDecodeError: 'utf8' codec can't decode byte 0xa1 in
> position 4: unexpected code byte
> takze ted nejak nevim kudy kam.
>
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>


Další informace o konferenci Python