[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