#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.