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 <CAHt6W4feXxZhd2ThXrjS41pjVZ9bqG17TdG=chHH0EVKFXi1tA@mail.gmail.com>
2012/10/19 Sebastien FLAESCH <[email protected]>:
> Hello Frediano,
>
> Summary: Issue fixed when using SQL_WLONGVARCHAR.
>

Good!

> 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.
>

Mmm... I'll check why SQL_LONGVARCHAR does not work. Are you using
unixODBC or iODBC? Which version?
You should use TDS_Version=7.2 to get support for (N)VARCHAR(MAX). 8.0
was an old name for 7.1 so 8.0 < 7.2 (my mind got a syntax error :-) )

Thanks for using development version!

>
>>> 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).
>

Yes, but that's why SQL_(W)LONGVARCHAR are designed for. Simply MS
could just map (N)VARCHAR(MAX) to these ODBC types if a version that
support (N)VARCHAR(MAX) is detected.

> There are other SQL Server specific defines in sqlncli.h such as:
>
>    SQL_SS_TIME2_STRUCT
>

Mmm.... I though this was supported but is not. This will require the
use of TDS_Version=7.3. SQL_SS_TIME2 is supported (returned by
driver), SQL_SS_TIME2_STRUCT no.

>>> Thanks for reading, please let me know what I should use!
>>>
>>> Seb
>>

Frediano
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.