PostgreSQL: Переполнение числового поля при десятичном / числовом типе данных — Почему это приводит к этой ошибке

#sql #postgresql #sqldatatypes

Вопрос:

Я создаю таблицу, подобную этой

 CREATE TABLE foo (
    id serial CONSTRAINT id_pk PRIMARY KEY,
    bar varchar(256),
    test decimal(5,5)
);
 

Затем я хочу заполнить test столбец

  INSERT INTO foo (test) VALUES (12345.12345)
 

Это дает мне

Деталь переполнения числового поля: Поле с точностью 5, масштаб 5, округляется до абсолютного значения менее 1.

Я этого не понимаю. Я подумал , что если я задам столбцу значение decimal(5,5) , у меня должно быть пять цифр слева от запятой и пять цифр справа от запятой. У меня есть это вместе с номером 12345.12345 .

Почему это дает мне эту ошибку?

Комментарии:

1. Потому что десятичная точность-это не то, что вы думаете. Первое число-это общее количество десятичных цифр, а не количество цифр перед разделителем. Ты хочешь decimal(10, 5) .

2. Попробуй с DECIMAL(10,5) . Параметр слева от запятой-общая длина, параметр справа-количество десятичных знаков.

3. psql Тег относится к инструменту командной строки и здесь не имеет значения. Пожалуйста, не добавляйте его

Ответ №1:

Вы неправильно поняли, как работает указание десятичной дроби (и это немного сбивает с толку, я согласен).

Цитата из руководства

Точность числа-это общее количество значащих цифр во всем числе, то есть количество цифр с обеих сторон десятичной точки. Масштаб числа-это количество десятичных цифр в дробной части справа от десятичной точки

Таким образом, первое число определяет общее количество цифр, второе — количество десятичных знаков.

Если вам нужно 5 цифр до десятичной точки и пять после нее, вам нужно использовать decimal(10,5)

Комментарии:

1. @Stophface . . . Просто хочу подчеркнуть: именно так SQL определяет масштаб и точность, поэтому он работает так во всех базах данных, а не только в Postgres.