Re: unicode

[email protected] (Christos Zoulas)
Newsgroups gmane.comp.db.tds.freetds
Organization Astron Software
Message-ID <[email protected]>
On Jul 22,  7:04pm, [email protected] ("James K. Lowden") wrote:
-- Subject: Re: [freetds] unicode

| Christos Zoulas wrote:
| > 
| > If you declare a column nstring instead of string then you should
| > use N'literals' (and the other way around). If you don't the server
| > will make an implicit conversion for you. 
| 
| The server makes an implicit conversion regardless.  
| 
| The string arrives at the server encoded as UCS-2, as you know.  It is
| stored in a column according to the column's encoding, as you know. 
| Whether or not you put an 'N' at the front.  
| 
| > It is very important to
| > get the types right, because if you don't, then the implicit
| > conversion will happen on each row, prohibiting the use of indexes,
| > and have a severe performance impact.
| 
| Not if the client is correctly configured.  It's not as though there's a
| mix of unicode and non-unicode in the column.  
| 
| 1.  When  'literal' is stored as  varchar, it uses the single-byte
| encoding. 
| 2.  When N'literal' is stored as  varchar, it uses the single-byte
| encoding. 
| 3.  When  'literal' is stored as nvarchar, it uses USC-2.
| 4.  When N'literal' is stored as nvarchar, it uses USC-2.
| 
| There's no other choice.  
| 
| What you *can* do is goof up the client end.  You can get "correct"
| results as far as the application is concerned while storing complete
| garbage.  
| 
| If, say, your client is ISO 8859-1 and you use the N'UFT-8' form, FreeTDS
| will convert your utf-8 data as though it were 8859-1.  Byte are bytes; it
| will "convert".  The data arrive as "USC-2", seemingly.  When stored in a
| varchar column, those bytes are converted again, according to the column's
| collation.  (They won't be the text you sent, but they'll store OK.) 
| Querying with another tool will show problems.  
| 
| Except that it won't completely work, because not every value in the
| [0-255] range is valid ISO 8859-1.  But FreeTDS will complain about that. 
| 
| 
| What am I missing?  I still don't see what effect the 'N' prefix can have.

It is not a freetds issue. On query analyzer, create a table with a
varchar column. Add an index to it. Then select * from table where
column = N'foo'. Look at the query plan. Try the same with select * from
table where name = 'foo'.

If you are using java, then you should set the URL for the server to have
sendStringParametersAsUnicode appropriately.

As a point of reference in java, using stmt.setString(string)
produces a different trace as stmt.setBytes(string.getBytes()).
The names might be wrong here.  I have not had this problem for a
long time :-)

christos
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.