在ColdFusion 10中使用CF_SQL_NVARCHAR的详细信息是什么?
有关更新数据库的ColdFusion 10文档中有一节介绍。该页面提到现在支持在ColdFusion 10中使用CF_SQL_NVARCHAR的详细信息是什么?,coldfusion,coldfusion-10,Coldfusion,Coldfusion 10,有关更新数据库的ColdFusion 10文档中有一节介绍。该页面提到现在支持CF\u SQL\u NVARCHAR,但没有详细说明。此外,还没有更新以包含它们的存在 提到CF\u SQL\u VARCHAR映射到MSSQL中的VARCHAR。除非ColdFusion管理员启用了字符串格式设置,否则这是正确的。在这种情况下,CF\u SQL\u VARCHAR映射到nvarchar。这个文档记录不完整的特性是一个可以在ColdFusion中使用的黑客攻击 因此,他们引入了CF\u SQL\u N
CF\u SQL\u NVARCHAR
,但没有详细说明。此外,还没有更新以包含它们的存在
提到CF\u SQL\u VARCHAR
映射到MSSQL中的VARCHAR
。除非ColdFusion管理员启用了字符串格式设置,否则这是正确的。在这种情况下,CF\u SQL\u VARCHAR
映射到nvarchar
。这个文档记录不完整的特性是一个可以在ColdFusion中使用的黑客攻击
因此,他们引入了CF\u SQL\u NVARCHAR
,这很好,但了解它的工作原理会很好。它仅仅是CF\u SQL\u VARCHAR
的别名,让它变得毫无意义?它是否总是以nvarchar
的形式发送字符串?如果是这样的话,CF\u SQL\u VARCHAR
是否总是发送VARCHAR
为了向后兼容,我希望它的实现如下:
如果启用了String Format
,CF\u SQL\u VARCHAR
和CF\u SQL\u NVARCHAR
则两者都映射到NVARCHAR
如果禁用了String Format
,则CF\u SQL\u VARCHAR
映射到VARCHAR
,而CF\u SQL\u NVARCHAR
映射到NVARCHAR
这意味着任何CF10之前的站点都可以迁移到CF10并工作,与CF10之前的性能考虑相同
新站点,或重写所有查询以匹配数据库设计的CF_SQL\u VARCHAR
和CF_SQL\u NVARCHAR
的站点将不会受到CF10之前不可避免的性能损失
是否有人能证实这一点;如果有更正式的东西就更好了?当你在等待更正式的东西时,我会投入我的0.02美元
我做了一些挖掘,根据我的观察(使用MS SQL数据源),我相信:
CF\u SQL\u NVARCHAR
不仅仅是CF\u SQL\u VARCHAR
的别名。它映射到较新版本,这使您能够在更精细的级别上处理unicode值
CF\u SQL\u NVARCHAR
值始终被视为NVARCHAR
CF\u SQL\u VARCHAR
的处理取决于设置,与以前的版本相同李>
CF\u SQL\u NVARCHAR测试/结果:
如果启用数据源日志记录,则可以看到驱动程序在使用CF\u SQL\u NVARCHAR
时调用特殊方法。因此,最终将值作为nvarchar
发送到数据库。(您可以使用SQL探查器确认这一点)
“当设置被启用时,它被当作varchar处理。当它被禁用时,它被当作nvarchar处理。”我想你的意思是相反的?是的。谢谢你指出这一点。当我看到您的评论时,我正在修复它。@Leigh,您如何在驱动程序上启用数据源日志记录?
// 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'Стоял он, дум великих полн'
// 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 ','????? ??, ??? ??????? ????'