Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby istnieje tylko jeden typ liczb całkowitych — Integer. W poprzednich wersjach Ruby istniały osobne klasy dla liczb całkowitych o różnych rozmiarach, takie jak Fixnum dla małych liczb całkowitych i Bignum dla dużych liczb całkowitych. Począwszy od wersji Ruby 2.4, te klasy zostały połączone w jedną klasę Integer.
W Ruby nie ma podziału na int i bigint, jak w bazach danych. Jedyna klasa Integer może reprezentować zarówno małe, jak i duże liczby całkowite. Ta cecha pozwala Ruby bez problemu pracować z dowolnymi liczbami całkowitymi, niezależnie od ich rozmiaru.
13.class => Integer 9223372036854775808.class => Integer
Jednak w kontekście baz danych, takich jak PostgreSQL, często spotykamy typy danych int i bigint, które reprezentują odpowiednio 32-bitowe i 64-bitowe liczby całkowite. W Ruby możemy pracować z dowolnym z tych typów danych, ale trzeba rozumieć, jak różnią się one w bazie danych oraz jak Ruby radzi sobie z dużymi liczbami.
Różnica między int a bigint
Jeśli uprościć - bigint może mieć większą maksymalną liczbę całkowitą. To znaczy, że jeśli włożymy zbyt dużą liczbę do int - otrzymamy błąd. Do tego potrzebujemy typu danych, który może przyjąć większe wartości. To jest przydatne w kontekście dużych baz danych. Jeśli wiesz, że baza będzie duża - używaj bigint. W przeciwnym razie w pewnym momencie będziesz musiał pisać migracje z int do bigint (dług techniczny będzie się kumulować, można tego uniknąć, znając przybliżoną / potencjalną skalę bazy danych).
Minimalne i maksymalne wartości int i bigint
Ok. Policzmy maksymalne liczby, które mogą mieć int i bigint:
# Minimalna i maksymalna wartość dla int (32-bitowa liczba całkowita)
min_int = -2**31
max_int = 2**31 - 1
puts "Min int: #{min_int}, Max int: #{max_int}"
Min int: -2147483648, Max int: 2147483647
# Minimalna i maksymalna wartość dla bigint (64-bitowa liczba całkowita)
min_bigint = -2**63
max_bigint = 2**63 - 1
puts "Min bigint: #{min_bigint}, Max bigint: #{max_bigint}"
Min bigint: -9223372036854775808, Max bigint: 9223372036854775807
Jeśli dodasz wartość poza tymi zakresami - otrzymasz błąd SQL:
ERROR: integer out of range # dla int ERROR: bigint out of range # dla bigint
Jeśli spróbujesz zapisać wartość przez aplikację Rails - zobaczysz błąd ActiveRecord.
Ten post nie ma jeszcze żadnych dodatków od autora.