[egenix-users] Two bugs in mxODBC: storing empty string and unicode string

M.-A. Lemburg mal at egenix.com
Mon Aug 13 17:48:30 CEST 2007


On 2007-08-13 15:37, Harri Pesonen wrote:
> Here is the script:
> 
> import mx.ODBC.Windows
> dsn = "Driver={SQL SERVER};Server=dskpesonha;Database=master;"
> connection = mx.ODBC.Windows.DriverConnect("%s;APP=%s" % (dsn, "test"),
> 0)
> connection.stringformat = mx.ODBC.Windows.MIXED_STRINGFORMAT
> o = connection.cursor()
> o.execute("CREATE TABLE #test (A nvarchar(64))")
> s  = "INSERT INTO #test (A) VALUES (?)"
> uc = u'\u0430'
> c = o.executedirect
> rs = c(s, ("",))
> rs = c(s, (u"",))
> rs = c(s, ("a",))
> rs = c(s, (uc,))
> o.execute("SELECT * FROM #test")
> rs = o.fetchall()
> for r in rs:
>   print r
> o  = None
> 
> Here is the output:
> 
> (u'',)
> (u' ',)
> (u'a',)
> (u'\u0430 ',)
> 
> So there is bug #3, empty unicode string is converted to one space. With
> mxODBC 2 the first case fails as well, you get 64 spaces.

Thanks.

We'll run a few tests and then report back our findings.

> -- Harri
> 
> -----Original Message-----
> From: M.-A. Lemburg [mailto:mal at egenix.com] 
> Sent: 13. elokuuta 2007 16:08
> To: Harri Pesonen
> Cc: egenix-users at lists.egenix.com
> Subject: Re: [egenix-users] Two bugs in mxODBC: storing empty string and
> unicode string
> 
> On 2007-08-13 14:19, Harri Pesonen wrote:
>> I tested with mxODBC 3, and 1) has been fixed. In mxODBC 2, it used
>> char(0) datatype internally, which was converted to char(8000) by SQL
>> Server ODBC driver. In mxODBC 3, it uses varchar(1) with empty string,
>> which works correctly. It does not add any extra spaces.
>>
>> 2) is still a problem in mxODBC3. It still uses char instead of
> varchar
>> for non-empty strings, so that I get "@P5 nchar(40)" and data
>> "N'CustomerAgentRedial1                    '". If mxODBC would use
>> nvarchar(40), then SQL Server ODBC driver would not add spaces to the
>> end. Of course this bug could be fixed by using the correct character
>> count in the first place.
>>
>> So both problems happened because char was used instead of varchar.
> Char
>> requires that there will be spaces in the end, there have to be
> exactly
>> as many characters in the string. With empty string, char(0) was
>> converted to char(8000) by the SQL Server driver because there is no
>> such data type as char(0).
>>
>> Using
>> connection.bindmethod = mx.ODBC.Windows.BIND_USING_PYTHONTYPE
>> does not seem to have any effect.
> 
> Could you provide us with the following ? We will then try to
> recreate the problem here and see what we can do about it.
> 
>  * table schema definition
> 
>  * inserts / selects exhibiting the problem
> 
> Thanks,

-- 
Marc-Andre Lemburg
eGenix.com

Professional Python Services directly from the Source  (#1, Aug 13 2007)
>>> Python/Zope Consulting and Support ...        http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ...             http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ...        http://python.egenix.com/
________________________________________________________________________

:::: Try mxODBC.Zope.DA for Windows,Linux,Solaris,MacOSX for free ! ::::


   eGenix.com Software, Skills and Services GmbH  Pastor-Loeh-Str.48
    D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
           Registered at Amtsgericht Duesseldorf: HRB 46611



More information about the egenix-users mailing list