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

sql sql-server tsql

20001 просмотра

6 ответа

Мне интересно, что литерал для нулевого символа (например, \ 0) в TSQL.

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

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

select REPLACE(field_with_nullchar, char(0), ',') from FOO where BAR = 20
Автор: t3rse Источник Размещён: 12.11.2019 09:17

Ответы (6)


17 плюса

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

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

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

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

Способ обработки неопределенных символов немного сбивает с толку, но именно так Windows определил их сортировку, а SQL Server соответствует общему API Windows.

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

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

Таким образом, кажется, что единственное решение состоит в том, чтобы изменить параметры сортировки на параметры сортировки SQL (например, SQL_Latin1_General_CP1_CI_ASтакже можно использовать).

* Я удалил свой предыдущий ответ за ненадобностью

Автор: Alex Размещён: 13.05.2010 04:23

10 плюса

Похоже, терминатор в стиле 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
Автор: Cade Roux Размещён: 13.05.2010 04:41

2 плюса

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
Автор: Alex K. Размещён: 14.05.2010 11:42

0 плюса

Я только что выполнил тест ниже на моем сервере (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"
Автор: Tom H Размещён: 13.05.2010 04:58

0 плюса

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

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

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

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

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

Автор: Blorgbeard Размещён: 13.05.2010 04:42

0 плюса

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

Select nullif(field_with_nullchar,'') from FOO where BAR = 20
Автор: Niederee Размещён: 09.09.2014 10:25
32x32