Подтвердить что ты не робот

Что такое литерал нулевого символа в TSQL?

Мне интересно, что буквально для Нулевой символ (например, '\ 0') находится в TSQL.

Примечание: не значение поля NULL, но нулевой символ (см. ссылку).

У меня есть столбец с сочетанием типичного и нулевого символов. Я пытаюсь заменить нулевой символ другим значением. Я бы подумал, что следующее будет работать, но это неуспешно:

select REPLACE(field_with_nullchar, char(0), ',') from FOO where BAR = 20
4b9b3361

Ответ 1

В ответе Cade Roux есть два разных поведения: замена выполнена успешно (при использовании сортировки SQL) и неудачной (используется сортировка Windows). Причина заключается в типе используемой сортировки.

Это было отправлено в Microsoft почти 4 года назад:

Q: При попытке заменить символ NUL с заменой(), это работает Значение имеет SQL-сортировку, но не Сравнение Windows.

A: Это связано с тем, что 0x0000 является символом undefined в Windows Параметры сортировки. Все символы undefinedигнорируются во время сравнения, сортировки, и сопоставление образцов. Так жгучая за 'a' + char (0) действительно ищет 'A, и поиск char (0) равен эквивалентно пустой строке.

Способ обработки символа undefinedнемного запутанна, но это путь, который Windows определил для сортировки, и SQL Server соответствует общий API Windows.

В SQL-сортировке нет понятия символа undefined. Каждый код точке присваивается вес, поэтому мы не видим там проблемы.

но, к сожалению, он все еще недокументирован.

Итак, единственное решение - изменить сортировку в SQL-сортировку (например, SQL_Latin1_General_CP1_CI_AS).

* Я удалил свой предыдущий ответ как ненужный

Ответ 2

Похоже, что терминатор C-стиля также является терминатором в SQL:

SELECT  REPLACE(bad, CHAR(0), ' ')
FROM    (
         SELECT 'a' + CHAR(0) + 'b' AS bad
        ) AS X

Похоже, он также зависит от COLLATION:

SELECT  REPLACE(CAST(bad COLLATE SQL_Latin1_General_CP1_CI_AS AS varchar(10)), CHAR(0), ' ')
FROM    (
         SELECT 'a' + CHAR(0) + 'b' AS bad
        ) AS X

работает как ожидалось, по сравнению с:

SELECT  REPLACE(CAST(bad COLLATE Latin1_General_CI_AS AS varchar(10)), CHAR(0), ' ')
FROM    (
         SELECT 'a' + CHAR(0) + 'b' AS bad
        ) AS X

Ответ 3

Вы уверены, что они являются нулевыми символами? Как вы их там получили?

Похоже, что SQL Server рассматривает их как ограничители строк. Этот запрос:

select 'aaa' + char(0) + 'bbb'

Возвращает aaa для меня (на SQL Server 2008).

Изменить: Выше неверно - это только сетка результатов, которая обрабатывает их таким образом. Они отображаются в текстовом режиме.

Ответ 4

Я только что проверил тест на моем сервере (2008), и он прошел успешно. Возможно, это связано с установкой ANSI. Я попробую перебросить некоторые настройки здесь и посмотреть, могу ли я воспроизвести вашу проблему.

DECLARE @test_null_char VARCHAR(20)

SET @test_null_char = 'aaa' + CHAR(0) + 'bbb'

SELECT @test_null_char    -- Returns "aaa bbb"

SET @test_null_char = REPLACE(@test_null_char, CHAR(0), 'ccc')

SELECT @test_null_char    -- Returns "aaacccbbb"

Ответ 5

A VARBINARY литье должно работать с любой сортировкой

SELECT 
   REPLACE(CAST(CAST(fld AS VARCHAR(5)) AS VARBINARY(5)), 0x0, ',')
FROM 
   (SELECT 'QQ' + CHAR(0) + 'WW' COLLATE Latin1_General_CI_AS AS fld) AS T

SELECT 
   REPLACE(CAST(CAST(fld AS VARCHAR(5)) AS VARBINARY(5)), 0x0, ',')
FROM 
   (SELECT 'QQ' + CHAR(0) + 'WW' COLLATE SQL_Latin1_General_CP1_CI_AS AS fld) AS T 

>>QQ,WW
>>QQ,WW

Ответ 6

У меня была такая же проблема, и использование nullif разрешило это для меня.

Select nullif(field_with_nullchar,'') from FOO where BAR = 20