当你在等待更正式的消息时,我会投入我的 0.02 美元......
我做了一些挖掘,根据我的观察(使用 MS SQL 数据源),我相信:
CF_SQL_NVARCHAR 测试/结果:
如果启用数据源日志记录,您可以看到驱动程序调用特殊的setNString http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setNString%28int,%20java.lang.String%29每当方法CF_SQL_NVARCHAR
用来。所以最终该值被发送到数据库nvarchar
。 (您可以使用 SQL Profiler 确认这一点)
// Query
SELECT ID
FROM Test
WHERE NVarcharColumn = <cfqueryparam value="#form.value#" cfsqltype="cf_sql_nvarchar">
// Log
spy(...)>> PreparedStatement[9].setNString(int parameterIndex, String value)
// Profiler
exec sp_prepexec @p1 output,N'@P1 nvarchar(4000)',N'SELECT ID
FROM Test
WHERE NVarcharColumn = @P1 ',N'Стоял он, дум великих полн'
CF_SQL_VARCHAR 测试/结果:
如果是CF_SQL_VARCHAR
,它在技术上被标记为varchar
。但是,那String Format
设置最终控制数据库如何处理它。当启用该设置时,它被处理为nvarchar
。当它被禁用时,它被视为varchar
。同样,您可以使用 SQL Profiler 来验证这一点。
最重要的是,到目前为止我所看到的一切都表明您的实施目标是正确的。
// Query
SELECT ID
FROM Test
WHERE PlainVarcharColumn = <cfqueryparam value="#form.value#" cfsqltype="cf_sql_varchar">
// Log
spy(..)>> PreparedStatement[8].setObject(int parameterIndex, Object x, int targetSqlType)
spy(..)>> parameterIndex = 1
spy(..)>> x = ????? ??, ??? ??????? ????
spy(..)>> targetSqlType = 12 (ie CF_SQL_VARCHAR)
// Profiler (Setting ENABLED)
exec sp_prepexec @p1 output,N'@P1 nvarchar(4000)',N'SELECT ID
FROM Test
WHERE PlainVarcharColumn = @P1 ',N'Стоял он, дум великих полн'
// Profiler (Setting DIS-abled)
exec sp_prepexec @p1 output,N'@P1 varchar(8000)',N'SELECT ID
FROM Test
WHERE PlainVarcharColumn = @P1 ','????? ??, ??? ??????? ????'