powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NEWID() Конвертнуть в 16 бит
17 сообщений из 17, страница 1 из 1
NEWID() Конвертнуть в 16 бит
    #40095058
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!
Переношу данные в SQLite, у них ключевое поле BLOB, разработчики говорят что используют GUID, но не строкой, а битами, то есть убирают из GUID "-" и конвертят в байты, как такой финт ушами можно реализовать через SQL Server?
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095063
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
cast(newid() as binary(16))
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095071
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
spenov,

Это просто обрежет результат. Обратно вы не получите то что было с него

Код: sql
1.
2.
3.
4.
5.
DECLARE @guid VARCHAR(36)= REPLACE(CONVERT(VARCHAR(36), NEWID()), '-', '');

SELECT @guid, 
       CONVERT(BINARY(16), @guid), 
       CONVERT(VARCHAR(36), CONVERT(BINARY(16), @guid));



Я так думаю, что убрав дефисы, нужно по 2 символа переводить в байты

A5A78F4143A046A49EB0E4755F1D68FE => A5 A7 8F 41 43 A0 46 A4 9E B0 E4 75 5F 1D 68 FE и получим 16 байт
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095075
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,


Что то вроде такого (для примера несколько вариантов)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT '00' [исходник], CHAR(0x00) [в байте], CAST((CHAR(0x00)) AS BINARY(1)) [обратно]
UNION 
SELECT '02' [исходник], CHAR(0x02) [в байте], CAST((CHAR(0x02)) AS BINARY(1)) [обратно]
UNION 
SELECT 'D5' [исходник], CHAR(0xD5) [в байте], CAST((CHAR(0xD5)) AS BINARY(1)) [обратно]
UNION 
SELECT 'FF' [исходник], CHAR(0xFF) [в байте], CAST((CHAR(0xFF)) AS BINARY(1)) [обратно]


исходник в байте обратно
-------- ------- -------
00               0x00
02              0x02
D5       Х       0xD5
FF       я       0xFF
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095078
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mixon,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
DECLARE @guid VARCHAR(36)= REPLACE(CONVERT(VARCHAR(36), NEWID()), '-', '');

; WITH CTE AS
(
SELECT @guid [GUID], 
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 1,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 3,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 5,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 7,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 9,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 11,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 13,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 15,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 17,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 19,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 21,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 23,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 25,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 27,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 29,2), 2))+
CHAR(CONVERT(VARBINARY(1), SUBSTRING(@guid, 31,2), 2)) [16byte]
)
SELECT [GUID],
       [16byte],
	   DATALENGTH([16byte]) size,
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],1,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],2,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],3,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],4,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],5,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],6,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],7,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],8,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],9,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],10,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],11,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],12,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],13,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],14,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],15,1)), 2)+
	   CONVERT(VARCHAR(2), CONVERT(BINARY(1), SUBSTRING([16byte],16,1)), 2) [обратная конвертация]
FROM CTE
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095082
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixon

т GUID, но не строкой, а битами


Так GUID, и так по факту, не строка, а биты.
Ничо делать не нужно.

uniqueidentifier (Transact-SQL) 16-байтовый идентификатор GUID.

https://docs.microsoft.com/ru-ru/sql/t-sql/data-types/uniqueidentifier-transact-sql?view=sql-server-ver15
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095103
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может у автора GUID в базе строкой забиты?
uniqueidentifier - это двоичное поле.
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095137
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mixon
День добрый!
... используют GUID, но не строкой, а битами, то есть убирают из GUID "-" и конвертят в байты...


Вот тут бы узнать как они конвертируют. Судя по всему, раз они что то убирают вручную, то не встроенными средствами?
Оказывается (никогда не интересовался подробностями) в MS SQL GUID отображается визуально и хранится по-разному.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
DECLARE @g UNIQUEIDENTIFIER = NEWID();
SELECT @g [uid], CONVERT(BINARY(16), @g) [binary]

uid                                  binary
------------------------------------ ----------------------------------
9E6DF986-0215-4858-B575-C2F1CFFC54C8 0x86F96D9E15025848B575C2F1CFFC54C8

   9E6DF986-0215-4858-B575-C2F1CFFC54C8 - uid (строка - вывод на экран)
0x 86F96D9E 1502 5848 B575 C2F1CFFC54C8 - binary



Первые 3 разряда "перевернуты", остальные совпадают. Если они конвертируют так как в строке, то это уже будет не то пальто
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095140
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
declare @g uniqueidentifier   = newid();

declare @b binary(16)         = cast(@g as binary(16))

declare @r uniqueidentifier   = cast(@b as uniqueidentifier);

select @g, @r



Результат:
Код: plaintext
1.
5DFE1204-0D75-46EC-AACC-1E565EDB2030	5DFE1204-0D75-46EC-AACC-1E565EDB2030

Совпадают
5DFE1204-0D75-46EC-AACC-1E565EDB2030
5DFE1204-0D75-46EC-AACC-1E565EDB2030
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095141
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wlr-l,

select @b сделайте, я про него.
Код: sql
1.
2.
  5DFE1204-0D75-46EC-AACC-1E565EDB2030
0x0412FE5D 750D EC46 AACC 1E565EDB2030
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095147
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!
У точну ситуацию, я на стороне SQL Server генерил данные(фактически скрипт) для передачи в SQLite,
выкрутился следующим способом

'''x'+REPLACE(CONVERT(VARCHAR(50), NEWID()),'-','')+''''
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095150
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oleg_SQL,

declare @g uniqueidentifier = '5DFE1204-0D75-46EC-AACC-1E565EDB2030';
declare @b binary(16) = cast(@g as binary(16))
declare @r uniqueidentifier = cast(@b as uniqueidentifier);

select @g, @r, @b

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
5DFE1204-0D75-46EC-AACC-1E565EDB2030	5DFE1204-0D75-46EC-AACC-1E565EDB2030	0x0412FE5D750DEC46AACC1E565EDB2030
      04
    12
  FE
5D         75
         0D    EC
             46   
                  AACC 1E565EDB2030
Скорее всего так отображают процедуры вывода, потому что преобразование туда и обратно дает исходное значение.

GUID - это 128-битовая последовательность, но конечный пользователь работает с ней как со строкой (ссылку уже дал Алекс2).

Согласен, мы не знаем как именно ТС конвертирует байты в байты. Зачем переводить в строку, удалять из нее то, что добавлено при переводе и снова превращать это в байты?
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095154
Wlr-l
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо Mixonу.


declare @g uniqueidentifier = '5DFE1204-0D75-46EC-AACC-1E565EDB2030';
declare @b binary(16) = cast(@g as binary(16))
declare @r uniqueidentifier = cast(@b as uniqueidentifier);

select @g, @r, @b, '0x' + replace(@g, '-', '')


5DFE1204-0D75-46EC-AACC-1E565EDB2030
5DFE1204-0D75-46EC-AACC-1E565EDB2030
0x0412FE5D750DEC46AACC1E565EDB2030
0x5DFE12040D7546ECAACC1E565EDB2030
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095157
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Oleg_SQL
Wlr-l,

select @b сделайте, я про него.
Код: sql
1.
2.
  5DFE1204-0D75-46EC-AACC-1E565EDB2030
0x0412FE5D 750D EC46 AACC 1E565EDB2030


Это ж бред сравнивать строковое представление.
Римскими цифрами ишо запишите.
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095158
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixon
'''x'+REPLACE(CONVERT(VARCHAR(50), NEWID()),'-','')+''''
Код: sql
1.
select convert(varchar(50), cast(newid() as binary(16)), 1)
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095159
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
Oleg_SQL
Wlr-l,

select @b сделайте, я про него.
Код: sql
1.
2.
  5DFE1204-0D75-46EC-AACC-1E565EDB2030
0x0412FE5D 750D EC46 AACC 1E565EDB2030


Это ж бред сравнивать строковое представление.
Римскими цифрами ишо запишите.



я не сравниваю, а считаю, что преобразование в строку и обратно идет по некоему алгоритму.
...
Рейтинг: 0 / 0
NEWID() Конвертнуть в 16 бит
    #40095166
Oleg_SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://dba.stackexchange.com/questions/126446/is-there-a-penalty-for-using-binary16-instead-of-uniqueidentifier

И все же это не римские цифры. Свой алгоритм.

...
The issue with where the binary representation was generated has to do with the byte ordering of the first 3 out of the 4 "fields". If you follow the link above to the Wikipedia article, you will see that RFC 4122 specifies to use "Big Endian" encoding for all 4 fields, yet Microsoft GUIDs specify using "Native" Endianness. Well, Intel architecture is Little Endian, hence the byte order for the first 3 fields is reversed from systems following the RFC (as well as Microsoft-style GUIDs generated on Big Endian systems). The first field, "Data 1", is 4 bytes. In one Endianness it would be represented as (hypothetically) 0x01020304 . But in the other Endianness it would be 0x04030201 . So if the current database's BINARY(16) field was populated from an import file using 0x01020304 binary notation and that binary representation was generated on a system following the RFC, then converting the data currently in the BINARY(16) field into a UNIQUEIDENTIFIER will result in a different GUID than what was originally created. This does not really pose a problem IF the values never left the database, and the values are only ever compared for equality and not ordering
...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / NEWID() Конвертнуть в 16 бит
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]