ColdFusion 9 documentation for cfqueryparam提到CF_sql_VARCHAR映射到MSsql中的varchar.这是真的,除非ColdFusion Administrator datasource settings启用了字符串格式设置.在这种情况下,CF_sql_VARCHAR映射到nvarchar.这个记录不良的功能是可以在ColdFusion中的cause performance issues的黑客攻击.
所以很好,他们介绍了CF_sql_NVARCHAR,但很好理解它是如何工作的.它只是一个CF_sql_VARCHAR的别名,使它毫无意义?它总是发送字符串为nvarchar吗?如果是这样,CF_sql_VARCHAR是否始终在varchar中发送?
我希望为了实现向下兼容,这样实现:
如果启用了字符串格式CF_sql_VARCHAR和CF_sql_NVARCHAR都映射到nvarchar.
如果字符串格式被禁用,CF_sql_VARCHAR映射到varchar和CF_sql_NVARCHAR映射到nvarchar.
这意味着CF10之前的任何CF10现场可以移动到CF10,并且在CF10之前具有相同的性能考虑.
新建站点或重新编写所有查询以匹配CF_sql_VARCHAR和CF_sql_NVARCHAR与数据库设计的站点不会获得CF10之前不可避免的性能损失.
任何人都可以确认是否是这种情况;更好的,如果有东西官方?
解决方法
我做了一些挖掘,并根据我的观察(使用MS sql数据源)我相信:
> CF_sql_NVARCHAR不仅仅是CF_sql_VARCHAR的别名.它映射到较新的NVARCHAR jdbc type,它允许您在更细粒度的级别处理unicode值.
> CF_sql_NVARCHAR值始终被视为nvarchar
> CF_sql_VARCHAR的处理取决于String Format
的设置,与以前的版本相同.
CF_sql_NVARCHAR测试/结果:
如果启用数据源日志记录,则可以在使用CF_sql_NVARCHAR时看到驱动程序调用特殊的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_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'SELECT ID FROM Test WHERE PlainVarcharColumn = @P1 ',дум великих полн' // Profiler (Setting DIS-abled) exec sp_prepexec @p1 output,N'@P1 varchar(8000)','????? ??,??? ??????? ????'