[freetds] Status of UTF-8 support in 0.83 dev
James K. Lowden
jklowden at freetds.org
Thu Aug 14 11:53:23 EDT 2008
> James K. Lowden wrote:
> > "Wide" characters have a fixed width, usually 16 bits. UTF-8 has a
> > variable width and for the most part can be treated like ASCII
> > (strlen(3) et al.). Declaring UTF-8 as SQL_C_WCHAR incorrectly tells
> > the driver there's a character in every two bytes.
> Oh take care, actually there are 2 type specifications in
> SQLRETURN SQLBindParameter(
> SQLHSTMT StatementHandle,
> SQLUSMALLINT ParameterNumber,
> SQLSMALLINT InputOutputType,
> SQLSMALLINT ValueType, -- This is the C type
> SQLSMALLINT ParameterType, -- This is the SQL equivalent
> SQLULEN ColumnSize,
> SQLSMALLINT DecimalDigits,
> SQLPOINTER ParameterValuePtr,
> SQLINTEGER BufferLength,
> SQLLEN * StrLen_or_IndPtr);
> For sure, when using (char *) / UTF-8, ValueType *must* be SQL_C_CHAR,
> not SQL_C_WCHAR... (that one is for wchar_t).
> I was talking about ParameterType...
> Should it be SQL_W[VAR]CHAR or SQL_[VAR]CHAR when binding UTF-8?
Oh, I see. Your question surprises me, then, because IIUC the client-side
encoding doesn't matter for ParameterType. ParameterType describes the
data type of the parameter as used in the query, not as represented in the
client buffer. (I"m just an ODBC student. Correct me if I'm wrong.)
For instance, any of these pairs works:
For character data parameters, the choice of SQL_W[VAR]CHAR or
SQL_[VAR]CHAR is governed by the data type of the parameter as understood
by the server. For stored procedures, the parameter type is obvious: it's
declared within the procedure text. For placeholders in open SQL text, I
would say the type is always SQL_[VAR]CHAR.
That is, if your query is,
CREATE TABLE t (name nvarchar(30))
INSERT t values( ? )
You would use SQL_[VAR]CHAR.
Now, what to do when what you really want is equivalent to "INSERT t
values( N'string' )"? I assume it's still SQL_[VAR]CHAR, but I won't know
for sure until either Frediano explains or I figure out how sp_execute
One thing you could try is SQLDescribeParam with various combinations
using Microsoft's driver. We would follow whatever it says/expects.
More information about the FreeTDS