Re: What SQL type for SQLBindParameter for NVARCHAR(MAX)/NTEXT when using UTF-8 locale?
Sebastien FLAESCH <[email protected]>
| Newsgroups | gmane.comp.db.tds.freetds |
|---|---|
| Organization | Four Js Development Tools |
| Message-ID | <[email protected]> |
Hello Frediano, Summary: Issue fixed when using SQL_WLONGVARCHAR. More comments inlined. On 10/18/2012 09:54 PM, Frediano Ziglio wrote: > 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 was already using ClientCharset=UTF-8 in the ODBC data source. >> 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. I don't think so: I am using now SQL_WLONGVARCHAR, I have FreeTDS 0.92 installed. I have TDS_Version=8.0 set in the ODBC data source. But in the SQL Server Profiler, I see an N'@P1 NTEXT' parameter for sp_prepexec. >> 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... I think SQL_SS_LENGTH_UNLIMITED makes sense: By design, unlike [N]CHAR(x) or [N]VARCHAR(x) types, a LOB type has no size (it has a maximum size regarding storage limits). There are other SQL Server specific defines in sqlncli.h such as: SQL_SS_TIME2_STRUCT >> Thanks for reading, please let me know what I should use! >> >> Seb > > Frediano > _______________________________________________ > FreeTDS mailing list > [email protected] > http://lists.ibiblio.org/mailman/listinfo/freetds >