Postgresql中的类型转换&&pg_cast.md
来源:互联网 发布:都有哪些美食kol 知乎 编辑:程序博客网 时间:2024/05/17 20:32
github首发: https://github.com/TheFrancisHe/Postgresql/blob/master/Postgresql%E4%B8%AD%E7%9A%84%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2%26%26pg_cast.md
- Postgres 关于 pg_cast 中的介绍:
https://www.postgresql.org/docs/9.5/static/catalog-pg-cast.html
先从几个示例入手:
note:这些示例所涉及知识点: 1.类型转换 2.字符串转义
大致总结下此文:
pg里的类型转换: 显式、隐式、assignment(有人叫赋值转换,我觉得不大妥,所以就不翻译了。) 这三种转换。
显示: 不同类型间,称为显示转换。
隐式:同一类型间,低字节到高字节为隐式转换,比如 int 到 bigint
assignment: 同一类型间,高字节到低字节成为发assignment ,比如 smallint到int。
三种转换的示例下面有例子描述和解释
//implicitly-typed literal or constant隐式转换示例://An escape string constant is specified by writing the letter E (upper or lower case) just before the opening single quote, e.g., E'foo'.postgres=# create table typecast (name varchar(32) ,id int );CREATE TABLE//name为varchar类型,id为int。 postgres=# insert into typecast values ('foo',1);INSERT 0 1postgres=# insert into typecast values ('killBee',1);INSERT 0 1postgres=# insert into typecast values ('killer\nBee',1);INSERT 0 1postgres=# insert into typecast values (E'killer\nBee',1);INSERT 0 1postgres=# select * from typecast ; name | id -------------+---- foo | 1 killBee | 1 killer\nBee | 1 killer +| 1 Bee | (4 rows)//以上插入的数据也都是同类型的,这属于隐式转换。//运行sqlpostgres=# select castsource::regtype,casttarget::regtype,castcontext from pg_cast where castsource='varchar'::regtype; castsource | casttarget | castcontext -------------------+-------------------+------------- character varying | regclass | i // 那么为什么这里也是 隐式呢 ?? character varying | text | i // 那么为什么这里也是 隐式呢 ?? character varying | character | i // 那么为什么这里也是 隐式呢 ?? character varying | "char" | a // 那么为什么这里 是assignment 模式呢? character varying | name | i character varying | xml | e character varying | character varying | i //从这里可以看出来,从 character varying 到character varying 我搜寻了很多博客,从 百度百科到wiki ,终于明白,pg里定义的 显式转换、隐式转换、赋值转换(assignment)和 开发里不一样。 区别就是在开发里,不同类型间做转换,肯定是显示转换。 同一类型,高字节到低字节是隐式转换,低字节到高字节是显示转换(但是这种情况在pg里这种情况就叫做assignment!!!) 下面开始我的验证: postgres=# select castsource::regtype,casttarget::regtype,castcontext from pg_cast where castsource='int'::regtype; castsource | casttarget | castcontext ------------+------------------+------------- integer | bigint | i integer | smallint | a //同类型 高到低 integer | real | i integer | double precision | i integer | numeric | i integer | money | a //同类型 money 8 字节,int 4字节,低到高。 在这里 money 可以算作 数值类型。 integer | boolean | e integer | oid | i integer | regproc | i integer | regprocedure | i integer | regoper | i integer | regoperator | i integer | regclass | i integer | regtype | i integer | regconfig | i integer | regdictionary | i integer | regrole | i integer | regnamespace | i integer | "char" | e integer | abstime | e integer | reltime | e integer | bit | e(22 rows)其余情况各位逗比可以自行验证看看我说的是否正确。我比较容易较真,这是我总结出来的,我不知道官方文档有没有相应解释。最后的最后,举几个 显示转换类型的例子来结束吧! postgres=# create table naruto (flag boolean,boobar bit);CREATE TABLE从上面的对比可以看出来, int 到 boolean 和 bit 都是 显式转换,所以会出现如下错误:postgres=# insert into naruto values (1,1010101);//提示类型不匹配ERROR: column "flag" is of type boolean but expression is of type integerLINE 1: insert into naruto values (1,1010101); ^//同时给出了提示:要么重写一个值,要么进行类型转换。HINT: You will need to rewrite or cast the expression.postgres=# insert into naruto values (1::boolean,1010101);//提示第二个字段需要显示类型转换。ERROR: column "boobar" is of type bit but expression is of type integerLINE 1: insert into naruto values (1::boolean,1010101);HINT: You will need to rewrite or cast the expression.//成功插入数据!! 两个值都进行了显示转换!postgres=# insert into naruto values (1::boolean,1010101::bit);INSERT 0 1
这就是PG里的 隐式转换、显式转换的例子。
下面看看assignment!
postgres=# create table sasuke (id smallint);CREATE TABLE//插入默认是int型,int 4个字节, smallint 2个字节,所以是从高字节到低字节。//这就是 assignment ,插入成功,不需要cast或 ::进行强制转换,但是在开发里却需要标注,这是不同之处。postgres=# insert into sasuke values (5);INSERT 0 1//插入失败,超出smallint的范畴。postgres=# insert into sasuke values (55555555);ERROR: smallint out of rangepostgres=#
阅读全文
0 0
- Postgresql中的类型转换&&pg_cast.md
- PostgreSQL 类型转换
- PostgreSQL 类型转换
- postgreSQL 类型转换
- postgresql json 类型转换
- PostgreSQL 字段类型转换
- PostgreSQL数据库中的数据类型转换
- PostgreSQL SQL 输出列类型转换
- Postgresql由字符串类型转换成数字类型
- java中的类型转换
- java中的类型转换
- C#中的类型转换
- C#中的类型转换
- C#中的类型转换
- C#中的类型转换
- C#中的类型转换
- c#中的类型转换
- C#中的类型转换
- Java property 的加载读取
- Android实现文字逐字显示出来效果
- C++三种容器:list、vector和deque的区别
- winlogbeat监听windows日志到kafka、hdfs,不同层级取数据
- Packet for query is too large (1029 > 1024). You can change this value on the server by setting the
- Postgresql中的类型转换&&pg_cast.md
- echarts 市级地图注意事项
- (37)接口实现和覆盖时的异常特点
- [平衡树]Tree(BST) + Heap = Treap
- CSS 控制单行文本和多行文本的显示区域不够存放时使用省略号...来替代的做法
- 无根树任意根深度加强版
- JavaScript设计模式总结
- JAVA 生产者与消费者模式
- git 命令大全