Also note pymssql is not well maintained right now due to lack of
funding, please confirm you reproduce your performance concerns using
PyODBC with Microsofts ODBC drivers ?  That should be considered to be
the canonically supported driver right now, works on all platforms
very well now.

On Fri, Mar 29, 2019 at 10:07 AM Mike Bayer <mike...@zzzcomputing.com> wrote:
>
> OK so I saw that the "N" prefix is not generated with your test case
> either, so I re-read your email.  Can you clarify what you mean by
> "always encoded as NVARCHAR"?   are you referring to the simple fact
> that a Python string object is passed to the driver, and that the
> driver is behind the scenes applying the "N" in any case or is
> otherwise binding it as unicode in such a way that performance is
> impacted?   SQLAlchemy for many years passed bytestrings to drivers
> like pyodbc because they would simply crash if you passed them a
> unicode object, but once they supported it, SQLAlchemy was eager to
> get out of the business of doing this encoding.    In 1.3 we've just
> deprecated all the flags that allow it to do this
> (convert_unicode=True).    Using that flag would be your quickest way
> to get it back for now but we'd have to develop an all new behavior
> for 1.4 if we are to start encoding these binds again, however current
> behavior has been this way for many years and this is the first it's
> being reported in this way.  I would want to look into driver
> configuration options for this as well.
>
>
>
>
> On Fri, Mar 29, 2019 at 9:56 AM Mike Bayer <mike...@zzzcomputing.com> wrote:
> >
> > On Fri, Mar 29, 2019 at 6:20 AM Ian Wagner <ianthetec...@gmail.com> wrote:
> > >
> > > Hello all,
> > >
> > > I'm trying to get to the bottom of an issue in which Python 3 (unicode by 
> > > definition) strings are always encoded as NVARCHAR for at least two 
> > > backends (pymssql and pyodbc). Using bytstrings as comparison arguments 
> > > (for example Table.column == value.encode('utf-8')) sends a regular 
> > > string literal as expected, but regular strings are encoded as NVARCHAR 
> > > literals.
> > >
> > > This behavior is fairly logical at the underlying driver (pymssql or 
> > > pyodbc) level, which is why I'm posting here. I believe the the use of a 
> > > String column (as opposed to a Unicode column) type should not pass an 
> > > NVARCHAR literal. Doing so has disastrous performance implications, as 
> > > SQL Server ends up casting the whole column up. This will wreak havoc 
> > > when regularly dealing with large-ish tables (1.7 million rows or so in 
> > > our case).
> > >
> > > I have previously posted with a LOT more details on StackOverflow 
> > > (https://stackoverflow.com/questions/55098426/strings-used-in-query-always-sent-with-nvarchar-syntax-even-if-the-underlying-c).
> > >  I also have an MCVE over on GitHub 
> > > (https://github.com/ianthetechie/pymssql_sqlalchemy_55098426).
> > >
> > > In my MCVE, I outline a possible approach for fixing this, but it appears 
> > > to have some problems. I'm posting here asking for feedback on what's 
> > > wrong with my approach, and what would be the best way to go about 
> > > getting this fixed.
> >
> > seems like we will need some documentation for this as it is confusing
> > a lot of people.   The issue that introduced this behavior is
> > https://github.com/sqlalchemy/sqlalchemy/issues/4442 and then that
> > same user felt it was happening too often in
> > https://github.com/sqlalchemy/sqlalchemy/issues/4561, however I
> > clarified that the N prefix only generates if there is no other
> > context to determine that this is not a non-unicode context.
> >
> > the NVARCHAR thing should not happen if you are comparing to a
> > non-NVARCHAR column.   it only occurs when there is no other context
> > that SQLAlchemy can determine the correct datatype for the Unicode
> > object being passed.
> >
> > However, the example case you have on github there seems to be using a
> > unicode in a VARCHAR comparison so should not see the N.  If it does,
> > it's a bug.  I will try your test case now.
> >
> > In the future, please go straight to the SQLAlchemy github issue
> > tracker with a succinct test case, as this N thing is obviously still
> > ongoing.
> >
> >
> >
> > >
> > > Thanks!
> > > Ian
> > >
> > > --
> > > SQLAlchemy -
> > > The Python SQL Toolkit and Object Relational Mapper
> > >
> > > http://www.sqlalchemy.org/
> > >
> > > To post example code, please provide an MCVE: Minimal, Complete, and 
> > > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> > > description.
> > > ---
> > > You received this message because you are subscribed to the Google Groups 
> > > "sqlalchemy" group.
> > > To unsubscribe from this group and stop receiving emails from it, send an 
> > > email to sqlalchemy+unsubscr...@googlegroups.com.
> > > To post to this group, send email to sqlalchemy@googlegroups.com.
> > > Visit this group at https://groups.google.com/group/sqlalchemy.
> > > For more options, visit https://groups.google.com/d/optout.

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to