NumericValueOutOfRange Постгреса

Когда вы сталкиваетесь с такой ошибкой,

ActiveRecord :: RangeError: PG :: NumericValueOutOfRange:
ОШИБКА: переполнение числового поля
ДЕТАЛИ: поле с точностью 18, масштаб 6 должно округляться до абсолютного значения меньше 10 ^ ¹²

В базе данных Postgres в одной из моих таблиц было поле, определенное как числовое (18,6). Определение числового типа данных согласно документации: «до 13 1072 знаков до десятичной точки; до 16383 знаков после запятой ».

Https://www.postgresql.org/docs/9.6/static/datatype-numeric.html

Когда я попытался вставить 18-значные целые числа, я получил следующую ошибку.

— SQL Error [22003]: ERROR: numeric field overflow Detail: A field with precision 18, scale 6 must round to an absolute value less than 10¹².

К целому значению добавлена ​​шкала 6, всего 24 цифры. Отсюда и ошибка. По шкале от 6 до 18 цифр.
Например:

123456789012345678 (18-значное целое число)
добавляемая шкала 6.
123456789012345678.000000 (цифры 000000 помимо точки (.) Шкалы 6)

Всего 24,
Здесь значение целой части должно быть меньше 12 цифр 123456789012 (12 цифр).

insert into my_table values (‘Test’, 1234567890);

Запись успешно вставлена.

insert into my_table values (‘Test’, 1234567890.1234567);

Здесь у меня 7 цифр после десятичной точки, шкала 6 не расширяется, вместо этого значение правой стороны округляется до 6 и сохраняется.

insert into my_table values (‘Test’, 12345678901234567)
 — SQL Error [22003]: ERROR: numeric field overflow Detail: A field with precision 18, scale 6 must round to an absolute value less than 10¹².

в качестве точки оптимизации нам нужно увеличить количество цифр перед десятичной точкой.

ALTER TABLE my_table ALTER COLUMN value NUMERIC(22,6)

Francium Tech - технологическая компания, специализирующаяся на поставке высококачественного масштабируемого программного обеспечения на экстремальных скоростях. Цифры и размер данных нас не пугают. Если у вас есть какие-либо требования или вы хотите бесплатно проверить работоспособность своих систем или архитектуры, напишите письмо по адресу [email protected], мы свяжемся с вами!