Man page - create_cast(7)
Manual
CREATE CAST
NAMESYNOPSIS
DESCRIPTION 描 述
PARAMETERS 参 数
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 兼 容 性
SEE ALSO 参 见
译 者
NAME
CREATE CAST - 定 义 一 个 用 户 定 义 的 转 换
SYNOPSIS
CREATE CAST
(
sourcetype
AS
targettype
)
WITH FUNCTION
funcname
(
argtype
)
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST
(
sourcetype
AS
targettype
)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
DESCRIPTION 描 述
CREATE CAST 定 义 一 个 新 的 转 换 。 一 个 转 换 说 明 如 何 在 两 个 类 型 之 间 进 行 转 换 。 比 如 :
SELECT CAST(42 AS text);
通 过 调 用 前 面 声 明 的 一 个 函 数 , 把 整 数 常 量 42 转 换 成 类 型 text, 在 这 个 例 子 里 是 text(int4)。 ( 如 果 没 有 预 先 定 义 好 合 适 的 转 换 , 那 么 这 个 转 换 失 败 。 )
两 种 类 型 可 以 是 二 进 制 兼 容 的 , 意 思 是 它 们 之 间 可 以 "自 由 转 换 "而 不 用 调 用 任 何 函 数 。 这 就 需 要 那 个 对 应 的 数 值 使 用 同 样 的 内 部 表 现 形 式 。 比 如 , 类 型 text 和 varchar 是 二 进 制 兼 容 的 。
缺 省 时 , 只 有 在 明 确 要 求 转 换 的 情 况 下 才 调 用 一 个 转 换 , 也 就 是 一 个 明 确 的 CAST(x AS typename), x::typename, 或 者 typename(x) 构 造 。
如 果 转 换 标 记 为 AS ASSIGNMENT, 那 么 在 赋 一 个 数 值 给 目 标 数 据 类 型 的 字 段 的 时 候 , 可 以 隐 含 调 用 它 。 比 如 , 假 设 foo.f1 是 一 个 类 型 为 text 的 字 段 , 那 么
INSERT INTO foo (f1) VALUES (42);
如 果 从 类 型 integer 到 类 型 text 的 转 换 标 记 为 AS ASSIGNMENT, 上 面 的 这 句 就 被 允 许 , 否 则 就 不 允 许 。 ( 我 们 通 常 用 术 语 赋 值 转 换 来 描 述 这 种 转 换 。 )
如 果 转 换 标 记 为 AS IMPLICIT, 那 么 它 就 可 以 在 任 何 环 境 里 调 用 , 不 管 是 赋 值 还 是 在 表 达 式 的 内 部 。 比 如 , 因 为 || 接 受 text 操 作 数 ,
SELECT ’The time is ’ || now();
将 只 有 在 类 型 timestamp 到 text 的 转 换 标 记 为 AS IMPLICIT 的 时 候 才 允 许 。 否 则 我 们 就 必 须 明 确 书 写 转 换 , 比 如
SELECT ’The time is ’ || CAST(now() AS text);
( 我 们 通 常 使 用 术 语 隐 含 转 换 来 描 述 这 种 类 型 的 转 换 。 )
在 标 记 转 换 为 隐 含 的 这 个 问 题 上 保 守 一 些 是 明 智 的 。 过 于 丰 富 的 隐 含 转 换 路 径 会 导 致 PostgreSQL 选 择 让 人 奇 怪 的 命 令 的 解 析 , 或 者 是 完 全 不 能 解 析 命 令 , 因 为 存 在 多 个 可 能 的 解 析 。 一 条 好 的 拇 指 定 律 是 , 只 有 在 同 一 个 通 用 类 型 表 里 面 的 那 些 可 以 保 留 转 换 信 息 的 类 型 之 间 才 标 记 为 可 隐 含 调 用 转 换 。 比 如 , 从 int2 到 int4 可 以 合 理 地 标 记 为 隐 含 转 换 , 但 是 从 float8 到 int4 可 能 应 该 是 标 记 为 赋 值 转 换 。 跨 类 型 表 的 转 换 , 比 如 text 到 int4, 最 好 是 只 能 明 确 地 转 换 。
要 想 创 建 一 个 转 换 , 你 必 须 拥 有 源 或 者 目 的 数 据 类 型 。 要 创 建 一 个 二 进 制 兼 容 的 转 换 , 你 必 须 是 超 级 用 户 。 ( 做 这 个 限 制 是 因 为 一 种 有 问 题 的 二 进 制 兼 容 转 换 可 以 很 容 易 摧 毁 服 务 器 。 )
PARAMETERS 参 数
sourcetype
转 换 的 源 数 据 类 型 。
targettype
转 换 的 目 标 数 据 类 型 。
funcname ( argtype )
用 于 执 行 转 换 的 函 数 。 这 个 函 数 名 可 以 是 用 模 式 名 修 饰 的 。 如 果 它 没 有 用 模 式 名 修 饰 , 那 么 该 函 数 将 从 路 径 中 找 出 来 。 参 数 类 型 必 须 和 源 数 据 类 型 相 同 , 结 果 数 据 类 型 必 须 匹 配 转 换 的 目 标 类 型 。
WITHOUT FUNCTION
表 示 源 数 据 类 型 和 目 标 数 据 类 型 是 二 进 制 兼 容 的 , 所 以 不 需 要 什 么 函 数 来 执 行 转 换 。
AS ASSIGNMENT
表 示 转 换 可 以 在 赋 值 环 境 里 隐 含 调 用 。
AS IMPLICIT
表 示 这 个 转 换 可 以 在 任 何 环 境 里 隐 含 调 用 。
NOTES 注 意
用 DROP CAST 删 除 用 户 定 义 的 转 换 。
请 注 意 , 如 果 你 想 能 双 向 转 换 类 型 , 那 么 你 需 要 明 确 地 定 义 两 个 方 向 的 转 换 。
在 PostgreSQL 7.3 之 前 , 如 果 一 个 函 数 的 名 字 和 一 个 数 据 类 型 相 同 , 并 且 返 回 该 种 数 据 类 型 , 而 且 还 接 受 另 外 一 种 类 型 的 参 数 自 动 就 是 一 个 转 换 函 数 。 这 个 传 统 随 着 模 式 的 引 入 以 及 为 了 能 在 系 统 表 种 表 示 二 进 制 兼 容 的 转 换 就 被 废 弃 了 。 ( 内 置 的 转 换 函 数 仍 然 遵 循 这 个 命 名 规 则 , 但 是 它 们 现 在 必 须 在 系 统 表 pg_cast 里 显 示 为 转 换 。 )
EXAMPLES 例 子
要 使 用 函 数 int4(text) 创 建 一 个 从 类 型 text 到 类 型 int4的 转 换 :
CREATE CAST (text AS int4) WITH FUNCTION int4(text);
( 这 个 转 换 在 系 统 中 已 经 预 先 定 义 了 。 )
COMPATIBILITY 兼 容 性
CREATE CAST 命 令 遵 循 SQL99, 只 不 过 SQL99 没 有 提 供 二 进 制 兼 容 类 型 。 AS IMPLICIT 也 是 PostgreSQL 的 扩 展 。
SEE ALSO 参 见
CREATE FUNCTION [ create_function (7)], CREATE TYPE [ create_type (7)], DROP CAST [ drop_cast (7)]
译 者
Postgresql
中 文 网 站 何 伟
平 <laser@pgsqldb.org>.SH 跋
本 页 面 中 文 版
由 中 文 man 手 册 页
计 划 提 供 。
中 文 man 手 册 页 计
划 :
https://github.com/man-pages-zh/manpages-zh