Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Guest
Как MS SQL 2005 хранит decimal(p,s)

Прочитал на Wikipedia про Binary-coded decimal (BCD).

Идея в том, что каждому десятичному числу в соответствие ставят четырехбитный двоичный код. Эти четырехбитная последовательность и хранится физически вместо десятичного числа:

Decimal:    0      1     2     3     4     5     6     7     8     9
BCD: 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001

На пример:
Decimal: 352
BCD: 0011 0101 0010

Вопрос: А как реализовано физическое хранение decimal в MS SQL 2005?
6 ноя 09, 17:42    [7893922]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
десятичные и числовые (Transact-SQL)
6 ноя 09, 17:47    [7893946]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Guest
Спасибо. Оттуда я начал.

А Можно пример?
Как будет выглядеть десятичное число 211111111 (P=9, S=0) в MSSQL-ном бинарном представлении?
6 ноя 09, 17:56    [7894026]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
aleks2
Guest
Marvin Divo,

1100100101010100110011000111
6 ноя 09, 18:04    [7894100]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Guest
То, что Вы aleks2 сделали, это перевили 211111111 в двоичную систему.

Decimal: 211111111
Binary: 00001100 10010101 01001100 11000111 – 4 byte.

Вернемся к линку Паганеля:

Precision (Точность)  Storage Bytes (Байты хранилища)
1-9 5
10-19 9
20-28 13
29-38 17

Беру и тупо перевожу из десятичной в двоичную:

Precision 1-9
Decimal: 999999999
Binary: 00111011 10011010 11001001 11111111 – 4 byte (в таблице, байты хранилища – 5!)

Precision 10-19
Decimal: 9999999999999999999
Binary: 10001010 11000111 00100011 00000100 10001001 11100111 11111111 11111111 – 8 byte (в таблице – 9 Byte)

Precision 20-28
Decimal: 9999999999999999999999999999
Binary: 12 byte (в таблице 13 byte)

Precision 29-38
Decimal: 38 девяток
Binary: 16 byte (в таблице 17 byte)

Возникли вопросы:

1. MS SQL целый байт тратит на кодирование знака?

2. Можно ли SQL-ом вытащить значение записи в бинарном виде?
6 ноя 09, 23:28    [7895142]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Marvin Divo,

cast( as varbinary(128)) ?
6 ноя 09, 23:55    [7895251]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Guest
create table t1 (c1 decimal(9,0))

insert into t1 (c1) values (999999999)

select cast(c1 as varbinary(128)) as c1_binary from t1

Получил нечто мне не понятное. Locky прокомментируйте результат пожалуйста :)
с1_binary
0x09000001FFC99A3B
7 ноя 09, 00:44    [7895418]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Marvin Divo

Получил нечто мне не понятное. Locky прокомментируйте результат пожалуйста :)
с1_binary
0x09000001FFC99A3B

Это бинарное представление искомого числа.
Для дальнейших изысканий рекомендую обратится в блоги Storage Team, например.
7 ноя 09, 00:50    [7895441]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Member

Откуда:
Сообщений: 7
Насколько мне известно, 0x указывает Hexadecimal кодировку.

Hex: 09000001FFC99A3B
Decimal: 648518354927721019
Bin: Получилось 8 byte

Откуда 8 Byte ?!


locky
Для дальнейших изысканий рекомендую обратится в блоги Storage Team, например.
Я в MS блогах не силен. Ткните пальцем, если не сложно.
7 ноя 09, 01:14    [7895543]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
http://blogs.msdn.com/sqlserverstorageengine/
также можно почитать http://sqlblog.com/blogs/kalen_delaney/ и её книги

А зачем вам, собственно, эта информация? Из спортивного интереса?

-------------------------
There’s no silver bullet!
7 ноя 09, 01:16    [7895556]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Member

Откуда:
Сообщений: 7
Хм. Я вообще-то думал, что это все знают/должны знать. Даже стеснялся вначале спросить как-то.
7 ноя 09, 01:22    [7895584]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Marvin Divo
Хм. Я вообще-то думал, что это все знают/должны знать. Даже стеснялся вначале спросить как-то.

А зачем это знать? Ну, т.е. как бы знания лишними не бывают, но - зачем?
7 ноя 09, 01:27    [7895607]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
iljy
Member

Откуда:
Сообщений: 8711
Marvin Divo,
declare @d decimal(9,3)
set @d = 9234.123

select CAST(@d as varbinary(50))
---------------------------------------------------
0x09030001CBE68C00

0903 - decimal(9,3)
0001 - видимо что-то служебное
CBE68C00 - 008CE6CB = 9234123
7 ноя 09, 01:41    [7895663]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Member

Откуда:
Сообщений: 7
iljy
0001 - видимо что-то служебное

Экспериментальным путем обнаружено что:

0001 это +
0000 это -
7 ноя 09, 02:09    [7895756]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Member

Откуда:
Сообщений: 7
А вот это мне не понятно:
iljy
CBE68C00 - 008CE6CB = 9234123



Да, 0x8CE6CB в десятичном будет 9234123. Но что надо сделать с 0xCBE68C00 чтобы получить 0x8CE6CB?
7 ноя 09, 02:23    [7895787]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
aleks2
Guest
Marvin Divo
То, что Вы aleks2 сделали, это перевили 211111111 в двоичную систему.


А ты, бедолага, полагаешь что в MS идиоты сидят?
И выдумывают велосипед?
7 ноя 09, 08:09    [7895926]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Vurn
Member

Откуда:
Сообщений: 213
Marvin Divo
А вот это мне не понятно:
iljy
CBE68C00 - 008CE6CB = 9234123



Да, 0x8CE6CB в десятичном будет 9234123. Но что надо сделать с 0xCBE68C00 чтобы получить 0x8CE6CB?


В Intel процессорах числовые значения хранятся в кодировке Low byte first, то есть начиная с наименьшего байта.

Число 0xCBE68C00 разбиваем побайтно - 0xCB 0xE6 0x8C 0x00. И записываем в привычной для нас нотации - "младший байт - справа" 0x00 0x8C 0xE6 0xCB. Затем, пишем все слитно - 0x008CE6CB.
7 ноя 09, 10:59    [7896072]     Ответить | Цитировать Сообщить модератору
 Re: Как MS SQL 2005 хранит decimal(p,s)  [new]
Marvin Divo
Member

Откуда:
Сообщений: 7
Всем спасибо. С cast(c1 as varbinary(128)) разобрался.

C Subj тоже:
Decimal хранится в обычном двоичном коде, плюс целый байт отводится для кодирования знака.
7 ноя 09, 12:22    [7896189]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить