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

Откуда: Москва
Сообщений: 694
Всем привет. У меня в базе встречаются символы char(0), база в Cyrillic_General_CI_AS. Они не нужны, но replace не заменяет их. Более того,

SELECT * FROM my_tbl where AttachmentId='210125'


Выдает только кусок строки до этого символа char(0), поэтому, видимо, replace их не видит. А вот bcp видит:

C:\>bcp "select AttachmentUid from my_tbl where AttachmentId=210125" queryout c:\migr\dat\MedicalDocuments.dat -S DB-SQL -U tst -P 123456 -c -C RAW

В файл уходит:

old-13951418-139154969-0-???? ???
^
Это не пробел, это char(0)

Вот тут нашел, как найти его через varbinaty. Вопрос - как заменить его на пустоту ('') или пробел?
8 июн 15, 10:27    [17743330]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey Agafonov
Вопрос - как заменить его на пустоту ('') или пробел?

Наверное надо запрос написать так, чтобы для поля AttachmentUid вместо char(0) возвращалась "пустота или пробел"
8 июн 15, 10:31    [17743348]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Alexey Agafonov
Member

Откуда: Москва
Сообщений: 694
Это и есть мой вопрос - КАК это написать? replace не работает
8 июн 15, 10:35    [17743363]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey Agafonov
replace не работает

С чего это вдруг ?
8 июн 15, 10:36    [17743365]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Alexey Agafonov
Member

Откуда: Москва
Сообщений: 694
Glory,

select replace(cast (AttachmentUid as nvarchar(max)),char(0),'')


Даже так не работает. И апдейт делал. len выдает 33 символа (это так и есть, включая char(0) и три следующих символа), а на экране 29 символов, bcp выгружает 33, но в файле перед последней тройкой символов выгружается char(0)
8 июн 15, 10:43    [17743407]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexey Agafonov
Даже так не работает.

Да конечно.
Не работает - это когда не меняет символ char(0).
А когда не меняет другие символы - это как раз работает
8 июн 15, 10:48    [17743421]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
кстате занятно
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2861.0 (X64)
Aug 20 2012 19:28:58
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

declare @t table (
   x nvarchar(20) collate Cyrillic_General_CI_AS
)
insert into @t 
select CAST((CHAR(65) +CHAR(65) +CHAR(0)) as nvarchar(20))

select RIGHT(x, 1) , ASCII(RIGHT(x, 1)), SUBSTRING(x, 2,1) , ASCII(SUBSTRING(x, 2,1)), LEFT(x, 1), ASCII(LEFT(x, 1)) from @t

SELECT ASCII(RIGHT(REPLACE(x, CHAR(0), 'A'),1) )  from @t

update @t set
 x = REPLACE(x, CHAR(0), 'A')

select RIGHT(x, 1) , ASCII(RIGHT(x, 1)), SUBSTRING(x, 2,1) , ASCII(SUBSTRING(x, 2,1)), LEFT(x, 1), ASCII(LEFT(x, 1)) from @t


Но ... не меняет :)
8 июн 15, 11:03    [17743499]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
invm
Member

Откуда: Москва
Сообщений: 9687
https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
REPLACE performs comparisons based on the collation of the input. To perform a comparison in a specified collation, you can use COLLATE to apply an explicit collation to the input.
0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in REPLACE.
declare @s varchar(30) = 'aa' + char(0) + 'bb';

select
 len(@s),
 len(replace(@s collate Cyrillic_General_BIN, char(0) collate Cyrillic_General_BIN, ''));
8 июн 15, 11:06    [17743514]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx
кстате занятно
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2861.0 (X64)
Aug 20 2012 19:28:58
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)

declare @t table (
   x nvarchar(20) collate Cyrillic_General_CI_AS
)
insert into @t 
select CAST((CHAR(65) +CHAR(65) +CHAR(0)) as nvarchar(20))

select RIGHT(x, 1) , ASCII(RIGHT(x, 1)), SUBSTRING(x, 2,1) , ASCII(SUBSTRING(x, 2,1)), LEFT(x, 1), ASCII(LEFT(x, 1)) from @t

SELECT ASCII(RIGHT(REPLACE(x, CHAR(0), 'A'),1) )  from @t

update @t set
 x = REPLACE(x, CHAR(0), 'A')

select RIGHT(x, 1) , ASCII(RIGHT(x, 1)), SUBSTRING(x, 2,1) , ASCII(SUBSTRING(x, 2,1)), LEFT(x, 1), ASCII(LEFT(x, 1)) from @t



Но ... не меняет :)


invm,

Только что хлотел неаписать сам себе - что шарик тьі балбес :)) Со сслыкой на ету же статью в мсдн
8 июн 15, 11:18    [17743568]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31823
Alexey Agafonov
Glory,

select replace(cast (AttachmentUid as nvarchar(max)),char(0),'')



Даже так не работает. И апдейт делал. len выдает 33 символа (это так и есть, включая char(0) и три следующих символа), а на экране 29 символов, bcp выгружает 33, но в файле перед последней тройкой символов выгружается char(0)
Откуда у вас char(0) в юникодной строке? Типы данных всё таки должны быть одинаковые.
8 июн 15, 11:38    [17743668]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
o-o
Guest
alexeyvg
Откуда у вас char(0) в юникодной строке? Типы данных всё таки должны быть одинаковые.

да преобразует он сам в юникод, не в этом дело, отвечено выше, коллэйшен надо выбрать правильный
declare @s Nvarchar(30) = N'a' + Nchar(0) + N'b';

select @s, 
       replace(@s, Nchar(0), N''), -- Nchar(0), но не меняет
       replace(@s collate Cyrillic_General_BIN, char(0) collate Cyrillic_General_BIN, ''), -- char(0), зато collation подходящий -> меняет
       cast(replace(@s, Nchar(0), N'') as varbinary(10)), --  глазками убеждаемся, что 0000 на месте
       cast(replace(@s collate Cyrillic_General_BIN, char(0) collate Cyrillic_General_BIN, '')as varbinary(10)),-- 0000 ушел
       replace(@s, 'a', 'a1'), -- найдет ли 'a' в юникодной строке?
       cast(replace(@s, 'a', 'a1') as varbinary(10)) -- куда денется, он же преобразует в юникод, да и 'a1' -> 61003100, не 6131
8 июн 15, 12:19    [17743908]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31823
o-o
да преобразует он сам в юникод, не в этом дело, отвечено выше, коллэйшен надо выбрать правильный
Да, насчёт коллейшена уже видел, дело не в преобразованиях типа...

Странно, может, поведение сиквела изменилось, всегда менял реплейсом char(0) без каких либо приведений колелйшена. Но это было давно, наверное, даже до 7 версии.
8 июн 15, 14:35    [17744765]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
o-o
Guest
alexeyvg
Странно, может, поведение сиквела изменилось, всегда менял реплейсом char(0) без каких либо приведений колелйшена. Но это было давно, наверное, даже до 7 версии.

да не, все у вас ок, вы наверно тоже юзаете *сиквельный* коллэйшен,
у нас вон так и тянется с 2000-ого.
а не катит в *виндовом* коллейшене

К сообщению приложен файл. Размер - 48Kb
8 июн 15, 14:59    [17744900]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Alexey Agafonov
Member

Откуда: Москва
Сообщений: 694
invm
https://msdn.microsoft.com/ru-ru/library/ms186862.aspx
REPLACE performs comparisons based on the collation of the input. To perform a comparison in a specified collation, you can use COLLATE to apply an explicit collation to the input.
0x0000 (char(0)) is an undefined character in Windows collations and cannot be included in REPLACE.
declare @s varchar(30) = 'aa' + char(0) + 'bb';

select
 len(@s),
 len(replace(@s collate Cyrillic_General_BIN, char(0) collate Cyrillic_General_BIN, ''));


Спасибо за ответ. Суть заключается в нем. Остальное уже нюансы )
8 июн 15, 15:16    [17744991]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31823
o-o
да не, все у вас ок, вы наверно тоже юзаете *сиквельный* коллэйшен,
у нас вон так и тянется с 2000-ого.
а не катит в *виндовом* коллейшене
Да, точно, на всех работах, кроме последней, много лет был сиквельный коллейшен...
8 июн 15, 20:58    [17746675]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
Alexey Agafonov
Member

Откуда: Москва
Сообщений: 694
alexeyvg,

что такое сиквельный колэйшн? Какие еще бывают?
8 июн 15, 23:46    [17747316]     Ответить | Цитировать Сообщить модератору
 Re: bcp выгружает char(0)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31823
Alexey Agafonov
alexeyvg,

что такое сиквельный колэйшн? Какие еще бывают?
Коллейшен - это параметр (выбор, или название, алгоритма) сортировки (сравнения) символьных строк.

Есть встроенные правила сортировки, которые придумали разработчики сиквела, ещё не в микрософте, как я понимаю, а есть унаследованные (импортированные) от Windows
Можно использовать выбирать любой из этих двух наборов.

COLLATE
WIN
SQL
9 июн 15, 02:16    [17747525]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить