[freetds] Using PHP mssql_init/bind for sending Unicode to Stored Procedures

James K. Lowden jklowden at freetds.org
Thu Jun 12 00:06:20 EDT 2008


Jason Young (Morgon) wrote:
> perhaps it's simply a lack of NVARCHAR in the php_mssql 
> library, but I cannot send UTF8 data to SQL Server using 
> mssql_init/bind/execute - yet it's not a general fault in my setup, as I
> 
> can "EXEC blah N'<UTF Text>'" just fine.

In the case of "EXEC blah N'<UTF Text>'", the data are embedded in the SQL
text, which is converted to UCS-2 in libtds just before it's put on the
wire.  I'm not sure what, if anything, "N'foo'" does for you; I would
think "'foo'" would work just as well.  

In the case of dbrpcparam(), you're stuffing the data into a buffer and
telling the library the datatype. I'm not sure what happens -- I haven't
looked yet -- but *if* any conversion is done, it would be in libtds
during dbrpcsend().  

It's a little tricky because dbrpcparam() accepts VARCHAR and NVARCHAR
parameters. The libtds function that reads the parameter buffer must
distinguish between (VAR)CHAR, which should be converted, and N(VAR)CHAR,
which is by definition UCS-2 (and doesn't need to be and can't be
converted).  

src/dblib/unittests/rpc.c needs to be enhanced to test this feature, to
make sure we get it right.  Patches welcome!  

--jkl



More information about the FreeTDS mailing list