在ColdFusion 10中使用CF_SQL_NVARCHAR有什么细节?

有关更新数据库的ColdFusion 10文档在ColdFusion 10中有一个关于数据库相关增强的部分。 该页面提到现在支持CF_SQL_NVARCHAR等,但没有关于它们的细节。 另外, cfqueryparam文档没有被更新以包含它们的存在。

cfqueryparam的ColdFusion 9文档提到CF_SQL_VARCHAR映射到MSSQL中的varchar 。 这是真的,除非ColdFusionpipe理员数据源设置启用了String Format设置。 在这种情况下, CF_SQL_VARCHAR映射到nvarchar 。 这个logging不完善的function是一个可能导致 ColdFusion 性能问题的黑客攻击。

所以他们引入了CF_SQL_NVARCHAR是很好的,但是理解它是如何工作是很好的。 这只是CF_SQL_VARCHAR一个别名,使它毫无意义? 它总是发送string作为nvarchar ? 如果是这样, CF_SQL_VARCHAR总是在varchar发送?

我希望为了后向兼容的缘故,这样做是这样实现的:

如果启用了String FormatCF_SQL_VARCHARCF_SQL_NVARCHAR都映射到nvarchar

如果String Format被禁用,则CF_SQL_VARCHAR映射到varcharCF_SQL_NVARCHAR映射到nvarchar

这意味着任何CF10之前的网站都可以转移到CF10并且在CF10之前有相同的性能考虑。

新的站点或重写所有查询以匹配CF_SQL_VARCHARCF_SQL_NVARCHAR与数据库devise的CF_SQL_NVARCHAR将不会获得CF10之前无法避免的性能损失。

任何人都可以证实,如果是这样的话; 甚至更好,如果有官方?

当你正在等待更正式的事情时,我会投入我的$ 0.02。

我做了一些挖掘,根据我的观察(用MS SQL数据源),我相信:

  • CF_SQL_NVARCHAR不仅仅是CF_SQL_VARCHAR的别名。 它映射到较新的NVARCHAR jdbctypes ,它使您能够更细粒度地处理unicode值。

  • CF_SQL_NVARCHAR值始终被视为nvarchar

  • CF_SQL_VARCHAR的处理取决于String Format设置,与以前的版本相同。

CF_SQL_NVARCHARtesting/结果:

如果启用数据源日志logging,则只要使用setNString ,就可以看到驱动程序调用特殊的setNString方法。 所以最终的价值是作为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_VARCHARtesting/结果:

CF_SQL_VARCHAR的情况下,它在技术上被标记为varchar 。 但是, String Format设置最终控制数据库如何处理。 当设置被启用时,它被作为nvarchar处理。 当它被禁用时,它被视为varchar 。 再次,您可以使用SQL事件探查器进行validation。

底线,到目前为止我所看到的一切都表明你对实施的目标是正确的。

  // 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 ','????? ??, ??? ??????? ????'