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 到 booleanbit 都是 显式转换,所以会出现如下错误: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=# 
原创粉丝点击