postgresql 自动类型转换
一、错误案例
1、赋值错误:
ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20005} execute error. UPDATE sys_permission SET parent_id=? is_leaf=? internal_or_external=? WHERE id=?
org.postgresql.util.PSQLException: 错误: 字段 "is_leaf" 的类型为 integer, 但表达式的类型为 boolean 建议:你需要重写或转换表达式 位置:126 (在jeecgboot平台的菜单管理中会出现该问题)
解决方法:
update pg_cast set castcontext='a' where castsource ='boolean'::regtype and casttarget='integer'::regtype;
2、查询错误:
ERROR druid.sql.Statement:149 - {conn-10005, pstmt-20003} execute error. SELECT * FROM QRTZ_FIRED_TRIGGERS WHERE SCHED_NAME = 'quartzScheduler' AND INSTANCE_NAME = ? AND REQUESTS_RECOVERY = ?
org.postgresql.util.PSQLException: 错误: 操作符不存在: character varying = boolean
建议:没有匹配指定名称和参数类型的操作符. 您也许需要增加明确的类型转换.
解决方法:
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='text'::regtype;
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='character'::regtype;
update pg_cast set castcontext='i' where castsource ='boolean'::regtype and casttarget='character varying'::regtype;
用该方法之后应该可以执行转换了,但是有可能把true转换成"true"存到数据库中,这个时候,就需要用实例2的方法了
二、知识点总结
PostgreSQL 数据类型直接有3种转换,隐式转换,赋值转换,显式转换;对应的转换类型存在系统表 pg_cast中
三种方式分别对应 i(Implicit),a(Assignment),e(Explicit)
查询所有转换:
select castsource::regtype,casttarget::regtype,castcontext,castfunc from pg_cast where castsource='boolean'::regtype;
三者的转换关系为 i > a > e;意思是可以隐式转换的一定可以赋值转换和显式转换;可以赋值转换的一定可以显式转换
可以显式转换的不能隐式转换和赋值转换。i:主要用户表达式和赋值,a主要用于赋值。
https://github.com/digoal/blog/blob/master/201801/20180131_01.md
相关文章:
https://blog.csdn.net/qq_39727113/article/details/105371412
三、pg_cast中有的可以进行update,如果没有的可以create新的cast
实例1:自动将TEXT转换为TIMESTAMP
如果没有内置的转换函数,我们可能需要自定义转换函数来支持这种转换。(如果不需要转换函数:WITHOUT FUNCTION)
--创建转换fun
create or replace function cast_text_to_timestamp(text) returns timestamptz as $$
select to_timestamp($1, 'yyyy-mm-dd hh24:mi:ss');
$$ language sql strict ; --创建cast规则
create cast (text as timestamptz) with function cast_text_to_timestamp as ASSIGNMENT; --使用cast进行操作
insert into tbl123 values (1, text '2017-01-01 10:00:00');
实例2、自动将boolean转成text类型,注意integer的不要转
//创建fun
create or replace function bool_to_character(boolean) returns text as $$
select CAST($1::int as text);
$$ language sql strict; --这行创建cast会报错:类型 boolean 到 text 的转换已经存在,因此这行执行不了,只能用下面3行代码的方法进行update
create cast (bool as text) with function bool_to_character(boolean) as implicit; --更新cast(3种text类型都要处理character varying,character,text),先找fun的id,然后再找casttarget
update pg_cast set castcontext='i',castfunc=42127 where castsource ='boolean'::regtype and casttarget='text'::regtype; --查询casttarget
select castsource::regtype,casttarget::regtype,castcontext,castfunc from pg_cast where castsource='boolean'::regtype; --根据fun查询id:
SELECT oid,proname FROM pg_proc WHERE proname='bool_to_character'
四、cast创建语法
CREATE CAST (source_type AS target_type)
WITH FUNCTION function_name [ (argument_type [, ...]) ]
[ AS ASSIGNMENT | AS IMPLICIT ] CREATE CAST (source_type AS target_type)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ] CREATE CAST (source_type AS target_type)
WITH INOUT
[ AS ASSIGNMENT | AS IMPLICIT ]
解释:
1、WITH FUNCTION,表示转换需要用到什么函数。
2、WITHOUT FUNCTION,表示被转换的两个类型,在数据库的存储中一致,即物理存储一致。例如text和varchar的物理存储一致。不需要转换函数。
3、WITH INOUT,表示使用内置的IO函数进行转换。每一种类型,都有INPUT 和OUTPUT函数。使用这种方法,好处是不需要重新写转换函数。
除非有特殊需求,我们建议直接使用IO函数来进行转换。
4、AS ASSIGNMENT,表示在赋值时,自动对类型进行转换。例如字段类型为TEXT,输入的类型为INT,那么可以创建一个 cast(int as text) as ASSIGNMENT。
5、AS IMPLICIT,表示在表达式中,或者在赋值操作中,都对类型进行自动转换。(包含了AS ASSIGNMENT,它只对赋值进行转换)
6、注意,AS IMPLICIT需要谨慎使用,为什么呢?因为操作符会涉及到多个算子,如果有多个转换,目前数据库并不知道应该选择哪个?
因此,建议谨慎使用AS IMPLICIT。建议使用AS IMPLICIT的CAST应该是非失真转换转换,例如从INT转换为TEXT,或者int转换为numeric。
而失真转换,不建议使用as implicit,例如numeric转换为int。
本文参考文章:https://www.jb51.net/article/203366.htm
postgresql 自动类型转换的更多相关文章
- PostgreSQL 自定义自动类型转换(CAST)
转载自:https://yq.aliyun.com/articles/228271 背景 PostgreSQL是一个强类型数据库,因此你输入的变量.常量是什么类型,是强绑定的,例如 在调用操作符时,需 ...
- JavaScript系列文章:自动类型转换-续
在上一篇文章中,我们详细讲解了JavaScript中的自动类型转换,由于篇幅限制,没能覆盖到所有的转换规则,这次准备详细讲解一下. 上次我们提到了对象类型参与运算时转换规则: 1). 在逻辑环境中执行 ...
- JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
- postgresql数据类型转换
PostgreSQL数据类型转换需要使用语法 alter table tbname alter column fieldname type date_type 遇到需要转换为特殊类型如DATE.BOO ...
- 慕课网-安卓工程师初养成-2-9 Java中的自动类型转换
来源:http://www.imooc.com/code/1236 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 ...
- 【转】JavaScript系列文章:自动类型转换
我们都知道,JavaScript是类型松散型语言,在声明一个变量时,我们是无法明确声明其类型的,变量的类型是根据其实际值来决定的,而且在运行期间,我们可以随时改变这个变量的值和类型,另外,变量在运行期 ...
- c语言的自动类型转换
转自c语言的自动类型转换 自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.如 ...
- C语言自动类型转换
自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成lo ...
- python小白——进阶之路——day2天-———变量的缓存机制+自动类型转换
# ###同一文件,变量的缓存机制 ''' -->Number 部分 1.对于整型而言,-5~正无穷范围内的相同值 id一致 2.对于浮点数而言,非负数范围内的相同值 id一致 3.布尔值而言, ...
随机推荐
- C++设计模式 - 适配器模式(Adapter)
接口隔离模式 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题.甚至根本无法实现.采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案. 典型模式 Facade P ...
- 建议收藏!Harmony应用配置文件概述(Stage模型)
一. 应用配置文件 每个应用项目必须在项目的代码目录下加入配置文件,这些配置文件会向编译工具.操作系统和应用市场提供应用的基本信息. 在基于Stage模型开发的应用项目代码下,都存在一个app.jso ...
- Windows Server之KMS
KMS是什么? KMS全称是Key Management Service,本身就是微软官方提供的一种激活方式,通常用于大型组织客需要激活的客户端数量不固定的情况. 正常情况下,激活Windows系统需 ...
- 第十七篇:Django入门
一.模板 二.BootStrap使用 三.web框架简绍 四.Django使用 五.创建APP 六.APP各目录功能 七.静态文件处理 八.模板语言 九.请求过程
- 润乾报表与 ActiveReport JS 功能对比
简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片.不规则分组.自由格间运算.行列对称等技术,使得复杂报表的设计简单化,以往难以 ...
- Effective Python:第1条 查询自己使用的Python版本
命令行: python --version:通常可查看python2的版本: python3 --version:通常可查看python3的版本: 代码: import sys print(sys.v ...
- 调用App Store Connect Api
对iOS的证书.描述文件.账号.设备等管理,之前都去苹果开发者中心操作,官网上操作也比较繁杂,想搞一些自动化之类的,更是麻烦,有时候官网都打不开-- 其实苹果还提供里一套API接口,创建证书.创建账号 ...
- mysql入门操作(部分操作,不为完全格式)
查询数据库在电脑中绝对路径: show variables like '%datadir%'; 设置字符集 set names gbk; 导入数据库 source 绝对路径 eg: source D: ...
- maven报错:501 HTTPS Required
maven报错:501 HTTPS Required 简单来说,如果报错中出现http://repo1.maven.org/maven2/的字样的话,那么大概率就是Maven仓库的设置里的地址有问题, ...
- 云原生事件驱动引擎(RocketMQ-EventBridge)应用场景与技术解析
简介: RocketMQ 给人最大的印象一直是一个消息引擎.那什么是事件驱动引擎?为什么我们这次要推出事件驱动引擎这个产品?他有哪些应用场景,以及对应的技术方案是什么?本文我们就一起来看下. 作者:罗 ...