Я столкнулся со странным SQL-запросом, например
ALTER TABLE some_db.some_table
ADD COLUMN metadata_labels varchar(255) DEFAULT FALSE;
Я ожидаю, что это не удастся, потому что я добавляю логическое значение по умолчанию для столбца varchar
. Но по крайней мере на Postgres он выполняется успешно и я вижу следующее:
Мне кажется какое-то странное принуждение типа
Почему этот запрос не завершается ошибкой из-за несоответствия типов?
Это просто неявное преобразование false в «false», аналогично тому, как вы могли бы также написать, например, по умолчанию 200, и это будет преобразовано в «200». Вместо этого используйте логический столбец, если вы действительно хотите хранить только ложные или истинные значения.
@LaurenzAlbe Я пояснил вопрос. Я ожидаю, что запрос завершится ошибкой вместо того, чтобы молча преобразовать тип, и не понимаю логики, стоящей за этим. Звучит так, будто ввод JS предостерегает меня
Postgres выполняет неявное преобразование типов. Это задокументировано здесь:
https://www.postgresql.org/docs/current/typeconv.html
Таким образом, ваше выражение SQL совершенно верно, поскольку false::bool
может быть идеально преобразовано в 'bool'::text
.
Существует приведение присваивания от boolean
к text
, поэтому должно быть так, что значения DEFAULT
приемлемы, если есть приведение присваивания к целевому типу данных.
Глядя на столбец adbin
в каталоге pg_attrdef
, я вижу фактическое сохраненное выражение по умолчанию:
"varchar"(text(FALSE), 259, FALSE)
где внешняя функция — это преобразование в varchar(255)
.
Спасибо, я даже не знал о системных каталогах!
Какой у Вас вопрос?