Приведение типов postgresql: PostgreSQL : Документация: 11: 4.2. Выражения значения : Компания Postgres Professional

PostgreSQL : Документация: 9.6: 10.1. Обзор : Компания Postgres Professional

SQL — язык со строгой типизацией. То есть каждый элемент данных в нём имеет некоторый тип, определяющий его поведение и допустимое использование. PostgreSQL наделён расширяемой системой типов, более универсальной и гибкой по сравнению с другими реализациями SQL. При этом преобразования типов в PostgreSQL в основном подчиняются определённым общим правилам, для их понимания не нужен эвристический анализ. Благодаря этому в выражениях со смешанными типами можно использовать даже типы, определённые пользователями.

Анализатор выражений PostgreSQL разделяет их лексические элементы на пять основных категорий: целые числа, другие числовые значения, текстовые строки, идентификаторы и ключевые слова. Константы большинства не числовых типов сначала классифицируются как строки. В определении языка SQL допускается указывать имена типов в строках и это можно использовать в PostgreSQL, чтобы направить анализатор по верному пути. Например, запрос:

SELECT text 'Origin' AS "label", point '(0,0)' AS "value";

 label  | value
--------+-------
 Origin | (0,0)
(1 row)

содержит две строковых константы, типа

text и типа point. Если для такой константы не указан тип, для неё первоначально предполагается тип unknown, который затем может быть уточнён, как описано ниже.

В SQL есть четыре фундаментальных фактора, определяющих правила преобразования типов для анализатора выражений PostgreSQL:

Вызовы функций

Система типов PostgreSQL во многом построена как дополнение к богатым возможностям функций. Функции могут иметь один или несколько аргументов, и при этом PostgreSQL разрешает перегружать имена функций, так что имя функции само по себе не идентифицирует вызываемую функцию; анализатор выбирает правильную функцию в зависимости от типов переданных аргументов.

Операторы

PostgreSQL позволяет использовать в выражениях префиксные и постфиксные операторы с одним аргументом, а также операторы с двумя аргументами. Как и функции, операторы можно перегружать, так что и с ними существует проблема выбора правильного оператора.

Сохранение значений

SQL-операторы INSERT и UPDATE помещают результаты выражений в таблицы. При этом получаемые значения должны соответствовать типам целевых столбцов или, возможно, приводиться к ним.

UNION, CASE и связанные конструкции

Так как все результаты запроса объединяющего оператора SELECT должны оказаться в одном наборе столбцов, результаты каждого подзапроса SELECT должны приводиться к одному набору типов. Подобным образом, результирующие выражения конструкции CASE должны приводиться к общему типу, так как выражение CASE в целом должно иметь определённый выходной тип. То же справедливо в отношении конструкций ARRAY и функций GREATEST и LEAST

.

Информация о существующих преобразованиях или приведениях типов, для каких типов они определены и как их выполнять, хранится в системных каталогах. Пользователь также может добавить дополнительные преобразования с помощью команды CREATE CAST. (Обычно это делается, когда определяются новые типы данных. Набор приведений для встроенных типов достаточно хорошо проработан, так что его лучше не менять.)

Дополнительная логика анализа помогает выбрать оптимальное приведение в группах типов, допускающих неявные преобразования. Для этого типы данных разделяются на несколько базовых категорий, которые включают: boolean, numeric, string, bitstring, datetime, timespan, geometric, network и пользовательские типы. (Полный список категорий приведён в Таблице 50.56; хотя его тоже можно расширить, определив свои категории.) В каждой категории могут быть выбраны один или несколько

предпочитаемых типов, которые будут считаться наиболее подходящими при рассмотрении нескольких вариантов. Аккуратно выбирая предпочитаемые типы и допустимые неявные преобразования, можно добиться того, что выражения с неоднозначностями (в которых возможны разные решения задачи преобразования) будут разрешаться наилучшим образом.

Все правила преобразования типов разработаны с учётом следующих принципов:

  • Результат неявных преобразованиях всегда должен быть предсказуемым и понятным.

  • Если в неявном преобразовании нет нужды, анализатор и исполнитель запроса не должны тратить лишнее время на это. То есть, если запрос хорошо сформулирован и типы значений совпадают, он должен выполняться без дополнительной обработки в анализаторе и без лишних вызовов неявных преобразований.

  • Кроме того, если запрос изначально требовал неявного преобразования для функции, а пользователь определил новую функцию с точно совпадающими типами аргументов, анализатор должен переключиться на новую функцию и больше не выполнять преобразование для вызова старой.

Иллюстрированный самоучитель по PostgreSQL › Краткий курс SQL › Преобразование типов [страница — 54] | Самоучители по программированию

Преобразование типов

В PostgreSQL поддерживаются три отдельных варианта синтаксиса преобразования (приведения) типов, то есть механизма приведения данных от одного типа к другому. В команде SQL преобразование типов позволяет явно задать тип создаваемой константы (вместо его косвенного определения по правилам языка).

В общем случае приведение строковой константы к другому типу может выполняться любым из трех способов:

тип 'значение'

'значение': – . тип

CAST ('значение' AS тип)

Числовые константы преобразуются в символьную строку следующими способами:

значение:: тип

CAST (значение AS тип)

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

Примечание
Помните, что тип money считается устаревшим, что несколько затрудняет его использование в преобразованиях
.

Преобразование к другому типу данных не ограничивается одними константами. Поля набора данных, возвращаемого запросом SQL, также могут преобразовываться к другому типу, при этом используются следующие формы синтаксиса:

идентификатор:: тип

CAST (идентификатор AS тип)

Следует учесть, что не каждый тип данных может быть приведен к любому другому типу. Например, не существует осмысленного преобразования символьной строки abed в двоичную последовательность типа bit. Недопустимые попытки преобразования приводят к ошибкам PostgreSQL. Чаще всего встречаются преобразования символьных строк, типов даты/времени или числовых типов к типу text, а также символьных строк в числа.

Кроме синтаксических форм преобразования типа существуют некоторые функции, позволяющие добиться практически того же результата. Имена этих функций часто совпадают с именами итоговых типов (например, text()), хотя существуют и узкоспециализированные варианты (например, bitfromint4()). В листинге 3.30 приведен пример использования функции text () для преобразования целого числа 1000 в строку типа text, содержащую символы «1000».

Листинг 3.30. Использование функции преобразования типа.

booktown=# SELECT text(1000)
booktown-# AS explicitjtext;
explicit_text

Postgres Pro Standard : Документация: 10: Глава 8. Типы данных : Компания Postgres Professional

bigintint8знаковое целое из 8 байт
bigserialserial8восьмибайтное целое с автоувеличением
bit [ (n) ] битовая строка фиксированной длины
bit varying [ (n) ]varbit [ (n) ]битовая строка переменной длины
booleanboolлогическое значение (true/false)
box прямоугольник в плоскости
bytea двоичные данные («массив байт»)
character [ (n) ]char [ (n
) ]
символьная строка фиксированной длины
character varying [ (n) ]varchar [ (n) ]символьная строка переменной длины
cidr сетевой адрес IPv4 или IPv6
circle круг в плоскости
date календарная дата (год, месяц, день)
double precisionfloat8число двойной точности с плавающей точкой (8 байт)
inet адрес узла IPv4 или IPv6
integerint, int4знаковое четырёхбайтное целое
interval [ поля ] [ (
p
) ]
 интервал времени
json текстовые данные JSON
jsonb двоичные данные JSON, разобранные
line прямая в плоскости
lseg отрезок в плоскости
macaddr MAC-адрес
macaddr8 Адрес MAC (Media Access Control) (в формате EUI-64)
money денежная сумма
numeric [ (p, s) ]decimal [ (p, s) ]вещественное число заданной точности
path геометрический путь в плоскости
pg_lsn
 Последовательный номер в журнале Postgres Pro
point геометрическая точка в плоскости
polygon замкнутый геометрический путь в плоскости
realfloat4число одинарной точности с плавающей точкой (4 байта)
smallintint2знаковое двухбайтное целое
smallserialserial2двухбайтное целое с автоувеличением
serialserial4четырёхбайтное целое с автоувеличением
text символьная строка переменной длины
time [ (p) ] [ without time zone ] время суток (без часового пояса)
time [ (p) ] with time zonetimetzвремя суток с учётом часового пояса
timestamp [ (p) ] [ without time zone ] дата и время (без часового пояса)
timestamp [ (p) ] with time zonetimestamptzдата и время с учётом часового пояса
tsquery запрос текстового поиска
tsvector документ для текстового поиска
txid_snapshot снимок идентификатора транзакций
uuid универсальный уникальный идентификатор
xml XML-данные

Postgres Pro Standard : Документация: 9.5: 9.8. Функции форматирования данных : Компания Postgres Professional

  • FM подавляет дополняющие пробелы и нули справа, которые в противном случае будут добавлены, чтобы результат имел фиксированную ширину. В Postgres Pro модификатор FM действует только на следующий код, тогда как в Oracle FM её действие распространяется на все последующие коды, пока не будет отключено последующим модификатором FM.

  • TM не затрагивает замыкающие пробелы. Функции to_timestamp и to_date игнорируют указание TM.

  • to_timestamp и to_date пропускают повторяющиеся пробелы во входной строке, если только не используется параметр FX. Например, to_timestamp('2000    JUN', 'YYYY MON') будет работать, но to_timestamp('2000    JUN', 'FXYYYY MON') вернёт ошибку, так как to_timestamp в данном случае ожидает только один разделяющий пробел. Приставка FX должна быть первой в шаблоне.

  • to_timestamp и to_date предназначены для обработки входных форматов, для которых недостаточно простого приведения. Эти функции интерпретируют вводимые данные с послаблениями, проверяя только грубые ошибки. Хотя они выдают корректные данные, результат может отличаться от ожидаемого. В частности, входные аргументы этих функций не ограничиваются обычными диапазонами, так что to_date('20096040','YYYYMMDD') выдаёт 2014-01-17, а не ошибку. С приведением такого не происходит.

  • Шаблоны для функций to_char могут содержать обычный текст; он будет выведен в неизменном виде. Чтобы вывести текст принудительно, например, если в нём оказываются поддерживаемые коды, его можно заключить в кавычки. Например, в строке '"Hello Year "YYYY', код YYYY будет заменён номером года, а буква Y в слове Year останется неизменной. В функциях to_date, to_number и to_timestamp при обработке подстроки в кавычках просто пропускаются символы входной строки по числу символов в подстроке, например для "XX" будут пропущены два символа.

  • Если вы хотите получить в результате кавычки, перед ними нужно добавить обратную косую черту, например так: '\"YYYY Month\"'.

  • Если формат года определяется менее, чем 4 цифрами, например, как YYY, и в переданном значении года тоже меньше 4 цифр, год пересчитывается в максимально близкий к году 2020, т. е. 95 воспринимается как 1995.

  • С преобразованием YYYY из строки в тип timestamp или date связано ограничение, когда обрабатываемый год записывается более чем 4 цифрами. После YYYY необходимо будет добавить не цифровой символ или соответствующий код, иначе год всегда будет восприниматься как 4 цифры. Например, в to_date('200001131', 'YYYYMMDD') (с годом 20000) год будет интерпретирован как состоящий из 4 цифр; чтобы исправить ситуацию, нужно добавить не цифровой разделитель после года, как в to_date('20000-1131', 'YYYY-MMDD'), или код как в to_date('20000Nov31', 'YYYYMonDD').

  • В преобразованиях из строки в тип timestamp или date, поле CC (век) игнорируется, если шаблон включает поля YYY, YYYY или Y,YYY. Когда CC используется с YY или Y, год вычисляется как год данного столетия. Если присутствует только код столетия, без года, подразумевается первый год этого века.

  • Даты по недельному календарю ISO 8601 (отличающиеся от григорианских) можно передать функциям to_timestamp и to_date одним из двух способов:

    • Год, номер недели и дня недели: например, to_date('2006-42-4', 'IYYY-IW-ID') возвращает дату 2006-10-19. Если день недели опускается, он считается равным 1 (понедельнику).

    • Год и день года: например, to_date('2006-291', 'IYYY-IDDD') также возвращает 2006-10-19.

    Попытка ввести дату из смеси полей григорианского и недельного календаря ISO 8601 бессмысленна, поэтому это будет считаться ошибкой. В контексте ISO 8601 понятия «номер месяца» и «день месяца» не существуют, а в григорианском календаре нет понятия номера недели по ISO.

    Внимание

    Тогда как to_date не примет смесь полей григорианского и недельного календаря ISO, to_char способна на это, так как форматы вроде YYYY-MM-DD (IYYY-IDDD) могут быть полезны. Но избегайте форматов типа IYYY-MM-DD; в противном случае с датами в начале года возможны сюрпризы. (За дополнительными сведениями обратитесь к Подразделу 9.9.1.)

  • При преобразовании из текстовой строки в timestamp, миллисекунды (MS) или микросекунды (US) воспринимаются как дробная часть числа секунд. Например, to_timestamp('12:3', 'SS:MS') — это не 3 миллисекунды, а 300, так как это значение воспринимается как 12 + 0.3 сек. Это значит, что для формата SS:MS вводимые значения 12:3, 12:30 и 12:300 задают одно и то же число миллисекунд. Чтобы получить три миллисекунды, время нужно записать в виде 12:003, тогда это будет воспринято как 12 + 0.003 = 12.003 сек.

    Ещё более сложный пример: to_timestamp('15:12:02.020.001230', 'Hh34:MI:SS.MS.US') будет преобразовано в 15 часов, 12 минут и 2 секунды + 20 миллисекунд + 1230 микросекунд = 2.021230 seconds.

  • Нумерация дней недели в to_char(..., 'ID') соответствует функции extract(isodow from ...), но нумерация to_char(..., 'D') не соответствует нумерации, принятой в extract(dow from ...).

  • Функция to_char(interval) обрабатывает форматы HH и Hh22 в рамках 12 часов, то есть 0 и 36 часов будут выводиться как 12, тогда как Hh34 выводит значение полностью и для интервалов выводимое значение может превышать 23.

  • postgresql — преобразование строки в целое число — Postgres

    Переполнение стека
    1. Около
    2. Продукты
    3. Для команд
    1. Переполнение стека Общественные вопросы и ответы
    2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
    3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
    4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
    5. Реклама Обратитесь к разработчикам и технологам со всего мира
    6. О компании
    .Приведение

    — SQL: невозможно привести запись типа к целому числу, PostgreSQL

    Переполнение стека
    1. Около
    2. Продукты
    3. Для команд
    1. Переполнение стека Общественные вопросы и ответы
    2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
    3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
    4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
    5. Реклама Обратитесь к разработчикам и технологам со всего мира
    6. О компании
    .Преобразование типа

    — postgresql приводит числовое значение к дате и формату

    Переполнение стека
    1. Около
    2. Продукты
    3. Для команд
    1. Переполнение стека Общественные вопросы и ответы
    2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
    3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
    4. Талант Нанимайте технических специалистов и создавайте свой бренд работодателя
    5. Реклама Обратитесь к разработчикам и технологам со всего мира
    6. О компании

    Загрузка…

    1. Авторизоваться зарегистрироваться
    2. текущее сообщество

    .

    Начало работы с типами данных PostgreSQL

    Резюме : в этом руководстве вы узнаете о типах данных PostgreSQL , включая логические, символьные, числовые, временные, массивы, json, uuid и специальные типы.

    Обзор типов данных PostgreSQL

    PostgreSQL поддерживает следующие типы данных:

    Boolean

    Тип данных Boolean может содержать одно из трех возможных значений: true, false или null. Используйте ключевое слово boolean или bool для объявления столбца с типом данных Boolean.

    Когда вы вставляете данные в логический столбец, PostgreSQL преобразует их в логическое значение

    • 1 , да , y , t , true значения преобразуются в true
    • 0 , нет , false , f значения преобразуются в false .

    Когда вы выбираете данные из логического столбца, PostgreSQL преобразует значения обратно, например, t в true, f в false и space в null .

    Character

    PostgreSQL предоставляет три типа символьных данных: CHAR (n) , VARCHAR (n) и TEXT

    • CHAR (n) — это символ фиксированной длины с заполненным пробелом. Если вы вставляете строку короче, чем длина столбца, PostgreSQL заполняет пробелы. Если вы вставите строку, длина которой превышает длину столбца, PostgreSQL выдаст ошибку.
    • VARCHAR (n) — символьная строка переменной длины.С VARCHAR (n) вы можете сохранить до n символов. PostgreSQL не заполняет пробелы, если хранимая строка короче, чем длина столбца.
    • ТЕКСТ — символьная строка переменной длины. Теоретически текстовые данные представляют собой символьную строку неограниченной длины.

    Числовые

    PostgreSQL предоставляет два разных типа чисел:

    Целые

    В PostgreSQL есть три вида целых чисел:

    • Маленькое целое ( SMALLINT ) — это 2-байтовое целое число со знаком, которое имеет диапазон от — От 32 768 до 32 767.
    • Целое число ( INT ) — 4-байтовое целое число в диапазоне от -2 147 483 648 до 2 147 483 647.
    • Serial — это то же самое, что и integer, за исключением того, что PostgreSQL автоматически генерирует и заполняет значения в столбце SERIAL . Это похоже на столбец AUTO_INCREMENT в MySQL или столбец AUTOINCREMENT в SQLite.

    Число с плавающей запятой

    Существует три основных типа чисел с плавающей запятой:

    • float (n) — это число с плавающей запятой, точность которого не менее n, но не более 8 байтов.
    • вещественное или float8 — это 4-байтовое число с плавающей запятой.
    • числовое или числовое (p, s) — действительное число с p цифрами с числом s после десятичной точки. Числовое значение (p, s) — точное число.

    Типы временных данных

    Типы временных данных позволяют хранить данные даты и / или времени. PostgreSQL имеет пять основных типов временных данных:

    • DATE хранит только даты.
    • ВРЕМЯ хранит значения времени суток.
    • TIMESTAMP хранит значения даты и времени.
    • TIMESTAMPTZ — это тип данных метки времени с учетом часовых поясов. Это сокращение от метки времени с указанием часового пояса.
    • ИНТЕРВАЛ хранит периоды времени.

    TIMESTAMPTZ — это расширение PostgreSQL для временных типов данных стандарта SQL.

    Массивы

    В PostgreSQL вы можете хранить массив строк, массив целых чисел и т. Д., в столбцах массива. Массив может пригодиться в некоторых ситуациях, например, при хранении дней недели, месяцев в году.

    JSON

    PostgreSQL предоставляет два типа данных JSON: JSON и JSONB для хранения данных JSON.

    Тип данных JSON хранит простые данные JSON, которые требуют повторного анализа для каждой обработки, а тип данных JSONB хранит данные JSON в двоичном формате, который быстрее обрабатывается, но медленнее вставляется.Кроме того, JSONB поддерживает индексацию, что может быть преимуществом.

    UUID

    Тип данных UUID позволяет хранить универсальные уникальные идентификаторы, определенные RFC 4122. Значения UUID гарантируют лучшую уникальность, чем SERIAL , и могут использоваться для скрытия конфиденциальных данных, открытых для публики, таких как значения id в URL.

    Специальные типы данных

    Помимо примитивных типов данных, PostgreSQL также предоставляет несколько специальных типов данных, связанных с геометрическими и сетевыми.

    • ящик — прямоугольный ящик.
    • строка — набор точек.
    • точка — геометрическая пара чисел.
    • lseg — отрезок линии.
    • многоугольник — замкнутый геометрический.
    • inet — IP4-адрес.
    • macaddr — MAC-адрес.

    В этом руководстве мы познакомили вас с типами данных PostgreSQL, чтобы вы могли использовать их для создания таблиц в следующем руководстве.

    • Было ли это руководство полезным?
    • Да Нет
    .

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *