Каковы детали использования CF_SQL_NVARCHAR в ColdFusion 10?

Документация ColdFusion 10 по обновлению базы данных содержит раздел об улучшениях, связанных с базой данных в ColdFusion 10 . На этой странице упоминается, что теперь есть поддержка CF_SQL_NVARCHAR , но нет подробностей о них. Кроме того, документация cfqueryparam не была обновлена, чтобы включить их существование.

Документация ColdFusion 9 для cfqueryparam упоминает, что CF_SQL_VARCHAR сопоставляется с varchar в MSSQL. Это верно, если только в настройках источника данных ColdFusion Administrator не включен параметр String Format . В этом случае CF_SQL_VARCHAR сопоставляется с nvarchar . Эта плохо документированная функция – это взлом, который может вызвать проблемы с производительностью в ColdFusion.

Поэтому здорово, что они внедрили CF_SQL_NVARCHAR , но было бы хорошо понять, как это работает. Это просто псевдоним для CF_SQL_VARCHAR что делает его бессмысленным? Всегда ли он отправляет строки как nvarchar ? Если да, то CF_SQL_VARCHAR всегда отправляется в varchar ?

Надеюсь, что для обратной совместимости он реализован как таковой:

Если параметр String Format включен CF_SQL_VARCHAR и CF_SQL_NVARCHAR оба отображаются в nvarchar .

Если String Format отключен, CF_SQL_VARCHAR сопоставляет карты varchar и CF_SQL_NVARCHAR с nvarchar .

Это означало бы, что любые сайты pre-CF10 могут перейти на CF10 и работать с такими же соображениями производительности до CF10.

Новые сайты или сайты, которые переписывают все запросы в соответствие с CF_SQL_VARCHAR и CF_SQL_NVARCHAR с дизайном базы данных, не получат штраф за производительность, который неизбежен до CF10.

Может ли кто-нибудь подтвердить, если это так; еще лучше, если с чем-то официальным?

Пока вы ждёте что-то более официальное, я заберу свои 0,02 доллара …

Я сделал некоторые копания и основываясь на своих наблюдениях (с источником данных MS SQL), я считаю, что:

  • CF_SQL_NVARCHAR – это не просто псевдоним для CF_SQL_VARCHAR . Он сопоставляется с новым типом NVARCHAR jdbc , который позволяет обрабатывать значения Unicode на более узком уровне.

  • Значения CF_SQL_NVARCHAR всегда рассматриваются как nvarchar

  • Обработка CF_SQL_VARCHAR зависит от параметра String Format , как и в предыдущих версиях.

CF_SQL_NVARCHAR Тест / результаты:

Если вы включите ведение журнала данных, вы увидите, что драйвер вызывает специальный метод CF_SQL_NVARCHAR всякий раз, когда используется CF_SQL_NVARCHAR . Таким образом, в конечном итоге значение отправляется в базу данных как nvarchar . (Вы можете подтвердить это с помощью SQL Profiler)

  // Query SELECT ID FROM Test WHERE NVarcharColumn =  // 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 =  // 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 ','????? ??, ??? ??????? ????' 
Давайте будем гением компьютера.