Skip to Content.
Sympa Menu

freetds - Re: [freetds] What SQL type for SQLBindParameter for NVARCHAR(MAX)/NTEXT when using UTF-8 locale?

freetds AT lists.ibiblio.org

Subject: FreeTDS Development Group

List archive

Chronological Thread  
  • From: Frediano Ziglio <freddy77 AT gmail.com>
  • To: FreeTDS Development Group <freetds AT lists.ibiblio.org>
  • Subject: Re: [freetds] What SQL type for SQLBindParameter for NVARCHAR(MAX)/NTEXT when using UTF-8 locale?
  • Date: Thu, 18 Oct 2012 20:54:54 +0100

2012/10/18 Sebastien FLAESCH <sf AT 4js.com>:
> 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




Archive powered by MHonArc 2.6.24.

Top of Page