Приведение типов 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
bigint | int8 | знаковое целое из 8 байт |
bigserial | serial8 | восьмибайтное целое с автоувеличением |
bit [ ( | битовая строка фиксированной длины | |
bit varying [ ( | varbit [ ( | битовая строка переменной длины |
boolean | bool | логическое значение (true/false) |
box | прямоугольник в плоскости | |
bytea | двоичные данные («массив байт») | |
character [ ( | char [ ( | символьная строка фиксированной длины |
character varying [ ( | varchar [ ( | символьная строка переменной длины |
cidr | сетевой адрес IPv4 или IPv6 | |
circle | круг в плоскости | |
date | календарная дата (год, месяц, день) | |
double precision | float8 | число двойной точности с плавающей точкой (8 байт) |
inet | адрес узла IPv4 или IPv6 | |
integer | int , int4 | знаковое четырёхбайтное целое |
interval [ | интервал времени | |
json | текстовые данные JSON | |
jsonb | двоичные данные JSON, разобранные | |
line | прямая в плоскости | |
lseg | отрезок в плоскости | |
macaddr | MAC-адрес | |
macaddr8 | Адрес MAC (Media Access Control) (в формате EUI-64) | |
money | денежная сумма | |
numeric [ ( | decimal [ ( | вещественное число заданной точности |
path | геометрический путь в плоскости | |
pg_lsn | Последовательный номер в журнале Postgres Pro | |
point | геометрическая точка в плоскости | |
polygon | замкнутый геометрический путь в плоскости | |
real | float4 | число одинарной точности с плавающей точкой (4 байта) |
smallint | int2 | знаковое двухбайтное целое |
smallserial | serial2 | двухбайтное целое с автоувеличением |
serial | serial4 | четырёхбайтное целое с автоувеличением |
text | символьная строка переменной длины | |
time [ ( | время суток (без часового пояса) | |
time [ ( | timetz | время суток с учётом часового пояса |
timestamp [ ( | дата и время (без часового пояса) | |
timestamp [ ( | timestamptz | дата и время с учётом часового пояса |
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
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.Приведение
— SQL: невозможно привести запись типа к целому числу, PostgreSQL
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.Преобразование типа
— postgresql приводит числовое значение к дате и формату
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
Загрузка…
- Авторизоваться
зарегистрироваться текущее сообщество
.
Начало работы с типами данных 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, чтобы вы могли использовать их для создания таблиц в следующем руководстве.
- Было ли это руководство полезным?
- Да Нет
.