[python] pymssql a collation

zu1234 zu1234 na seznam.cz
Úterý Duben 5 17:03:55 CEST 2011


Kdysi jsem tady psal o problémech s pymssql.
Nyní nastalo další dějství tohoto 'dramatu' :-)

Připomenu že se mi to na mojem PC chovalo tak, že ať jsem uvedl či 
neuvedl charset v pymssql.connect, vracela se mi char hodnota v kódování 
'cp852'.
Pokud jsem uvedl charset='cp1250' vracela se v typu unicode, ale 
nesmyslném v kódování 'cp852'.

Použil jsem dotyčný python program na stroji a hle, všechno je jinak a 
funguje jak má: pokud se v pymssql.connect nastaví charset='cp1250', 
char hodnoty jsou typu unicode a kódování je v pořádku.
Pokud se charset neuvede jsou char hodnoty typu str a v kódováni 'cp1250'.

Provedl jsem testy na jiných dvou PC s W-XP. Na jednom v pořádku na 
druhém 'cp852'.
Porovnal jsem seznam použitých dll a jejich verze: žádný rozdíl.

Napadá mne jediný závěr: prostě windows :-(

Ale nepovažuji se za žádného guru, tak třeba vás něco napadne.

Řešením asi bude "select CHAR(154)", otestovat co vlastně přišlo a 
zachovat se podle toho:

if ord(TXT[0]) == 231:
	print "cp852"

elif ord(TXT[0]) == 154:
	print "cp1250"

elif ord(TXT[0]) == 353:
	print "unicode"


ZU

Dne 8.9.2009 21:34, zu1234 napsal(a):
> Chlapi,
> děkuji za reakce a kód-y !
> Ale prostě mne zarazily dvě věci: jednak proč cp852 a jednak proč to
> nemohu změnit když fce pymssql.connect na to má dokonce parametr charset.
> Ale zatím to funguje a já holt nemusím fšemu rozumět :-)))
> ZU
>
>
> Jan Bednařík napsal(a):
>> Sorry, četl jsem tam MY-SQL ;-)
>>
>> Pokud máš skript v UTF-8, pak stačí na stringy z MS SQL použít
>> unicode(), asi takto:
>>
>> def unicode_string(s, enc):
>> return unicode(s, enc) if type(s) == type("") else s
>>
>> def unicode_tuple(t, enc):
>> return tuple([unicode_string(i, enc) for i in t])
>>
>> ...
>> for row in cursor.fetchall():
>> row = unicode_tuple(row, "windows-1250")
>> ...
>>
>> Honza


Další informace o konferenci Python