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

12

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

Документация ColdFusion 9 для cfqueryparam упоминает, чтоCF_SQL_VARCHAR карты дляvarchar в MSSQL. Это верно, если администратор ColdFusionнастройки источника данных имеет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.

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

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

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

Ваш Ответ

1   ответ
11

Пока вы ждете чего-то более официального, я добавлю свои 0,02 доллара ...

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

  • CF_SQL_NVARCHAR is not just an alias for CF_SQL_VARCHAR. It maps to the newer NVARCHAR jdbc type, which lets you to handle unicode values at a more granular level.

  • CF_SQL_NVARCHAR values are always treated as nvarchar

  • The handling of CF_SQL_VARCHAR depends on the String Format setting, same as in previous versions.

CF_SQL_NVARCHAR Test/Results:

Если вы включите ведение журнала источника данных, вы увидите, что драйвер вызывает специальныйsetNString метод всякий раз, когдаCF_SQL_NVARCHAR используется. Таким образом, в конечном итоге значение отправляется в базу данных как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 Test/Results:

В случае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'@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 ','????? ??, ??? ??????? ????'
& quot; Когда параметр включен, он обрабатывается как varchar. Когда он отключен, он рассматривается как nvarchar. & Quot; Я полагаю, вы имели в виду противоположность этому? nosilleg
@Leigh, как включить ведение журнала источника данных в драйвере?
Ага. Спасибо за указание на это. Я просто исправил это, когда увидел твой комментарий.

Похожие вопросы