在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 Format
, CF_SQL_VARCHAR
和CF_SQL_NVARCHAR
都映射到nvarchar
。
如果String Format
被禁用,则CF_SQL_VARCHAR
映射到varchar
, CF_SQL_NVARCHAR
映射到nvarchar
。
这意味着任何CF10之前的网站都可以转移到CF10并且在CF10之前有相同的性能考虑。
新的站点或重写所有查询以匹配CF_SQL_VARCHAR
和CF_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 ','????? ??, ??? ??????? ????'