Wstawiłem dwa rekordy do tabeli.
create table num(id int)
insert into num values(0023)
insert into num values(23)
select * from num
Kiedy je pytam, wszystkie wyświetlają się jako 23
. Oznacza to, że SQL Server ignoruje wiodące 0. Jaki jest za tym mechanizm? W jaki sposób SQL Server może zwracać wartości po ich wstawieniu (tj. 0023
I 23
)?
sql-server
sql-server-2008
użytkownik8365
źródło
źródło
id
powinny być typuVARCHAR
lub podobne.Odpowiedzi:
0023
nie jest liczbą. To jest struna.23
jest liczbą. SQL Server jest w stanie rozpoznać, że te dodatkowe zera nie są potrzebne do zdefiniowania liczby, więc je ignoruje. Jeśli chcesz, aby aplikacja miała wartość 0023, sugeruję wykonanie formatowania po stronie aplikacji. W ten sposób liczba przechowywana w SQL Server nadal jest liczbą, jeśli chcesz dodawać, agregować lub wykonywać inne obliczenia. Jeśli naprawdę musisz go zapisać jako „0023
”, musisz przekonwertować go na pole postaci; char, varchar, nvarchar, nchar.źródło
id
jakoVARCHAR
lub po prostu wstaw 23 zamiast 00230023
jest ciągiem, zapisz go jako ciąg. Jeśli nie, zapisz go jako INT i zapomnij o zerach wiodących.Było już powiedziane w innych odpowiedziach, które
00023
są liczbą; Chcę tylko dodać, że można użyć kolumn obliczeniowych do wyświetlenia tej liczby w niestandardowym formacie. Na przykład,źródło
0023 jest liczbą, ale int i inne typy danych liczbowych nie przechowują zer wiodących, ponieważ nie ma matematycznego powodu, aby to zrobić.
Jeśli chcesz przechowywać początkowe zera, użyj ciągu danych typu, np. Char, varchar itp
źródło
INT
ma on stałą długość (jak 32 bity), a do ich przechowywania użyto zapisu binarnego, wówczas zera wiodące są rzeczywiście przechowywane. Ale nie są wyświetlane na wyjściu.15
--this zajmuje tylko jedną cyfrę w systemie szesnastkowym,F
. Mają już inną liczbę „zer wiodących”. 2147483647 ma 10 cyfr, ale w zapisie szesnastkowym to tylko 7FFFFFFF lub 8 cyfr.