Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Ядовитый char(0)  [new]
телезритель
Guest
Приветствую всех, есть вопрос ку знатокам.

1. Ms Sql позволяет использовать строки с char(0):

select len(B) from (select '1'+char(0)+'3')A(B)


возвращает нам 3.

2. При этом функции charindex и patindex символ char(0) игнорируют:

select charindex(char(0),B), patindex('%[^1]%',B) from (select '1'+char(0)+'3')A(B)


возвращает нам не 2 и 2, как ожидалось бы, а 0 и 3.

3. Так вот, как выбрать строки таблицы A, содержащие символ char(0) в текстовом поле B, если строк в ней достаточно много?

Т.е. излишне много для того, чтобы парсить значение поля, перебирая каждый символ в рекурсивном представлении (что первое приходит в голову), казалось не очень хорошей идеей.
8 июл 15, 15:27    [17867954]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
телезритель,

зависит от COLLATE.
Например, с бинарным COLLATE Cyrillic_General_BIN всё получится.
select charindex(char(0),B COLLATE Cyrillic_General_BIN), patindex('%[^1]%',B COLLATE Cyrillic_General_BIN) from (select '1'+char(0)+'3')A(B)
8 июл 15, 15:31    [17867977]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
телезритель,

select charindex(0x00, convert(varbinary(10), '1'+char(0)+'3'))
8 июл 15, 15:32    [17867982]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
телезритель, почему Вы что-то ожидаете, даже не изучив документацию? Сравнивайте binary данные.
8 июл 15, 15:45    [17868051]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
уже ,навреное,пора в ФАК по форуму тему написать
8 июл 15, 15:45    [17868054]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
o-o
Guest
Maxx
уже ,навреное,пора в ФАК по форуму тему написать

и почувствовать себя fucked.
не добавляется больше ничего в местный ФАК
8 июл 15, 16:32    [17868353]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
телезритель
Guest
Спасибо, оба варианта работают!

Можно спросить, требует ли преобразование varchar в varbinary (вариант от WarAnt) реальных затрат времени на выполнение операции, или его можно считать указанием способа выполнения charindex, эквивалентным указанию collate?

P.S. Забавно, что если сделать
select B, '['+B+']' from (select '1'+char(0)+'3')A(B)

в SQL Managament Studio, то символы после нуля не отображаются.

- Видишь суслика?
- Нет.
- А он есть :):):)
8 июл 15, 16:54    [17868454]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
o-o
Guest
телезритель,
и это тоже тут обсуждали, надо переключить вывод студии с грида на текст, суслик проявится
8 июл 15, 16:56    [17868463]     Ответить | Цитировать Сообщить модератору
 Re: Ядовитый char(0)  [new]
телезритель
Guest
o-o, спасибо.
8 июл 15, 17:11    [17868544]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить