Re: What SQL type for SQLBindParameter for NVARCHAR(MAX)/NTEXT when using UTF-8 locale?
Frediano Ziglio <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Message-ID | <CAHt6W4d40ebbeSPtwA-kMb3wKhyHV2JCLQv4p=K2=wn61i9OFg@mail.gmail.com> |
2012/10/18 Sebastien FLAESCH <[email protected]>: > Hello, > > I am using a UTF-8 encoding in my Linux FreeTDS client program, > and want to insert LOB data into NVARCHAR(MAX)/NTEXT columns. > > For now, I bind the SQL Parameter with: > > ctype = SQL_C_CHAR; > sqltype = SQL_LONGVARCHAR; > precision = 0x10000000; > > This works find as long as the data is ASCII (and probably also > ISO-885901), but when using UTF-8 sequences, I get this error: > > SQL State: HY000 > SQL code : 2402 > [FreeTDS][SQL Server]Error converting characters into server's character set. Some character(s) could not be converted > Mmm... probably the encoding used by ODBC is not what you expected. Try setting the ClientCharset attribute. > I guess this is expected, because I use SQL_LONGVARCHAR... > Yes, longvarchar should be fine. I think FreeTDS should be smart enough to use NVARCHAR(MAX) from protocol 7.2. > For NCHAR/NVARCHAR types, I use SQL_WCHAR / SQL_WVARCHAR SQL types > to bind my UTF-8 buffers, and this works fine. > > But for large objects, what SQL type should I use? > > I tried with SQL_WVARCHAR and a large size, without success: > > [FreeTDS][SQL Server]Invalid string or buffer length > The encoding should be in SQLWCHAR with size in bytes usually (so multiple of sizeof(SQLWCHAR)) and probably you still want the long version (SQL_WLONGVARCHAR). > How to specify the precision for a CLOB? > > As a comparison, with Easysoft SQL Server ODBC driver, you can bind > UTF-8 buffers with: > > ctype = SQL_C_CHAR; > sqltype = SQL_WVARCHAR; > precision = SQL_SS_LENGTH_UNLIMITED; > I wasn't even aware of this constant! I don't understand why this extension is necessary... > Thanks for reading, please let me know what I should use! > > Seb Frediano