Як зберегти провідні нулі, коли я вставляю число в цю таблицю? [зачинено]


10

Я вставив два записи в таблицю.

create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num

Коли я їх запитую, вони відображаються як 23. Це означає, що SQL Server ігнорує провідні 0. Який механізм стоїть за цим? Як я можу змусити SQL Server повернути значення, коли я вставив їх (тобто 0023і 23)?


2
Чому ви дбаєте про провідні нулі? Якщо вони мають значення для вашої системи, вони idповинні мати тип VARCHARабо подібні.
Нік Чаммас

Як саме ви очікуєте, що 0023 буде закодовано в базі даних як щось інше, ніж 23 або 023 або 0000000023? Всі вони являють собою ту саму НОМЕРУ. І int - це кількість даних. Серверу немає місця для зберігання цього значення "провідна кількість десяткових нулів".
ЕрікЕ

Це невдале питання, яке було б висвітлено в будь-якому вступі до класу програмування. Інт ніколи не може зберігати провідні нулі через природу інтів. Це можна вирішити, переглянувши будь-яку кількість веб-ресурсів. Для цього не потрібно введення адміністратора бази даних.
jcolebrand

1
Провідні нулі мають на увазі. Крім того, що замість цього використовується рядок, якщо вам потрібна конкретна кількість провідних нулів, це додаткова інформація, що не зберігається в колоні int. В одному з варіантів використовується стовпчик рядків, але інший варіант - це збереження кількості провідних нулів або в іншому стовпці, або в інтерфейсі користувача. якщо, наприклад, інтерфейс завжди форматується на 4 цифри з прокладками, що ведуть нулі, наприклад, ви зберегли цю інформацію в інтерфейсі. Якщо вам потрібно змінити число нулів і зберегти їх для кожного запису, ви можете зберегти цю інформацію в окремому полі.
Дейв Кузен

Відповіді:


27

0023- це не число. Це струна. 23- це число. SQL Server може визнати, що ці додаткові нулі не потрібні для визначення числа, тому він ігнорує їх. Якщо ви хочете розіслати значення додатку як 0023 додатку, я б радив зробити форматування на стороні програми. Таким чином, число, що зберігається в SQL Server, все ще є числом, якщо ви хочете зробити додавання, агрегацію чи інші обчислення. Якщо ви дійсно повинні зберігати його як " 0023", вам потрібно перетворити його в поле символів; char, varchar, nvarchar, nchar.


Якщо рядок 0023 є рядком, як я можу вставити значення в таблицю, яку я визначив id як формат int?
користувач8365

@ user8365 - Визначте idяк VARCHARабо просто вставте 23 замість 0023
Lamak

5
@ user8365 - Ви запитуєте, чи можете ви змусити SQL Server порушувати цілісність домену цього поля. Ви не можете. Якщо 0023це рядок, то зберігайте її як рядок. Якщо це не так, зберігайте його як INT і забудьте про провідні нулі.
Нік Чаммас

Точно те, що сказав @NickChammas. Тут у вас немає вибору. 23 - це число, 0023 - рядок. Якщо ви хочете число, розглядайте його як число. Як каже моя відповідь, якщо це потрібно сортувати як число, додавати, віднімати, множувати, ділити тощо, як число, то воно повинно бути числом. Немає вибору. Аргументів немає. Провідні нулі - це просто форматування. Зробіть це в коді додатка чи десь.
Грант Фрітчі

@Grant Я не можу погодитися, що провідні нулі просто форматування. Вони легітимні в будь-якій системі числення; однак, 0023b10 = 23b10; Таким чином, будь-яка система зберігання набуває певного ступеня стиснення, не кодуючи всі провідні нулі. Отже, принципово наш запитуючий запитує неправильне запитання. Чому 0023 не є цілим числом? Це ціле число! Нам просто не потрібно кодувати нескінченність провідних цифр, щоб представити її як таку.
Ooutwire

5

В інших відповідях вже говорилося, що 00023це число; Я просто хочу додати, що ви можете використовувати обчислювані стовпці, щоб показати це число у користувальницькому форматі. Наприклад,

create table num_table(id int not null primary key identity(1,1),
num int, leading_zeros smallint,
constraint chk_leading_zero_nonnegative check (leading_zero>=0),
num_formatted as replicate('0',coalesce(leading_zeros,0)) +cast(num as varchar(10)));
insert into num_table(num,leading_zeros) values(23,2) ;
select num_formatted from num_table; -- output '0023'

Хороший момент, абсолютно варто відзначити.
Грант Фрітчі

0

0023 - це число, але int та інші типи даних про число не зберігають провідні нулі, оскільки немає математичних причин для цього.

Якщо вам потрібно зберегти нульові нулі, використовуйте рядковий тип даних, наприклад, char, varchar тощо


1
Якщо припустити, що INTфіксованої довжини (наприклад, 32 біти) і двійкове позначення використовується для їх зберігання, то провідні нулі дійсно зберігаються. Але вони не відображаються у висновку.
ypercubeᵀᴹ

@ypercube - Правильно, але кількість провідних нулів - це просто те, що потрібно, щоб заповнити 32 біти (на відміну від визначених користувачем).
Нік Чаммас

@ Nick: Так, ніяких суперечок немає. Я думаю, що справа НЕ в тому, зберігаються чи ні провідні нулі. Незалежно від того, чи можуть бути збережені дві версії одного і того ж числа у типі даних, одна з та одна без провідних нулів.
ypercubeᵀᴹ

Але це не має сенсу. Два десяткових провідні нулі абсолютно не мають відношення до кількості провідних нулів у 32-бітовому цілому. Розглянемо десяткове число 15--this займає одну цифру в шестнадцатиричное F. Вони вже мають різну кількість "провідних нулів". 2147483647 - це 10 цифр, але в шістнадцятковій кількості це лише 7FFFFFFF або 8 цифр.
ЕрікЕ

Принципово, слід враховувати математичну систему числення, яку ми використовуємо ... в цьому випадку десяткову (основа 10). 23 - десяткове число; це 0x1000 + 0x100 + 2x10 + 3 = 23. У восьмикутнику це 2X8 + 3 тощо. Так, сказати двигуну пам’яті, «зберігати 23 з двома провідними нулями» не є корисним, оскільки він просто кодує той самий кінцевий результат, тобто 23. SQL Server не ігнорує ваші нулі, він просто повертає вам десяткове значення дорівнює кількості, яку ви вставили, тобто 0023 або 23.
ooutwire
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.