【PostgreSQL-16新特性之类型转换测试功能】

这篇具有很好参考价值的文章主要介绍了【PostgreSQL-16新特性之类型转换测试功能】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PostgreSQL里的类型转换

在PostgreSQL里,“::” 符号其实是一个强制类型转换符,作用等同于CAST。
在很多情况下,我们需要将一种数据类型的值转换为另一种数据类型。那么我们就可以使用它来进行转换。

"::"的语法格式为:

expression::type

举个例子为:

postgres=# select '100'::integer,'100'::varchar;
 int4 | varchar 
------+---------
  100 | 100
(1 row)

CAST的语法格式为:

CAST ( expression AS target_type );

举个例子为:

postgres=# select CAST('100' as integer),CAST('100' as varchar);
 int4 | varchar 
------+---------
  100 | 100
(1 row)

除此之外类型转换可以使用一些to_开头的格式化函数进行转换,例如to_char,把数字转换成字符串等等。

postgres=# select to_char(125.8,'999D99MMM');
  to_char   
------------
  125.80MMM
(1 row)

二、类型转换失败会中断事务

但是在使用中,我们可能会遇到这样的问题,在PostgreSQL16版本之前,如果转换失败,则之前执行转换的失败的事务则会中断。

15.1 版本测试如下

postgres=# select version();
                                                       version                                                       
---------------------------------------------------------------------------------------------------------------------
 PostgreSQL 15.1 on aarch64-apple-darwin22.1.0, compiled by Apple clang version 14.0.0 (clang-1400.0.29.202), 64-bit
(1 row)

postgres=# select 'Abcd'::integer;
ERROR:  invalid input syntax for type integer: "Abcd"
LINE 1: select 'Abcd'::integer;
               ^
postgres=# 
postgres=# begin;
BEGIN
postgres=*# select now();
              now              
-------------------------------
 2023-07-04 12:01:45.204112+08
(1 row)

postgres=*#  select 'Abcd'::integer;
ERROR:  invalid input syntax for type integer: "Abcd"
LINE 1: select 'Abcd'::integer;
               ^
postgres=!#  select now();
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=!# end;
ROLLBACK

或者是使用CAST的时候发生转换失败,也会中断事务

postgres=# begin;
BEGIN
postgres=*# select CAST('100' as integer),CAST('100' as varchar);
 int4 | varchar 
------+---------
  100 | 100
(1 row)

postgres=*# select CAST('asd' as integer),CAST('100' as varchar);
ERROR:  invalid input syntax for type integer: "asd"
LINE 1: select CAST('asd' as integer),CAST('100' as varchar);
                    ^
postgres=!# select now();
ERROR:  current transaction is aborted, commands ignored until end of transaction block
postgres=!# end;
ROLLBACK

三、PostgreSQL16版本新增类型转换测试函数

PostgreSQL-16版本新增两个相关函数,pg_input_is_valid()和pg_input_error_message()。

postgres=# \df *input*
                                                                         List of functions
   Schema   |        Name         | Result data type |                                          Argument data types                                          | Type 
------------+---------------------+------------------+-------------------------------------------------------------------------------------------------------+------
 pg_catalog | pg_input_error_info | record           | value text, type_name text, OUT message text, OUT detail text, OUT hint text, OUT sql_error_code text | func
 pg_catalog | pg_input_is_valid   | boolean          | text, text                                                                                            | func
(2 rows)

pg_input_is_valid():测试转换是否成功或失败
pg_input_error_message():如果转换失败,可以查看错误信息

当我们在事务里进行想进行类型转换的时候,可以先用pg_input_is_valid()去测试是否可以正常转换,如果可以转换,函数返回t,再继续进行,如果函数返回结果为f,则不进行此转换,则不会因类型转换失败导致事务中断。

postgres=# select pg_input_is_valid('100','integer');
 pg_input_is_valid 
-------------------
 t
(1 row)

postgres=# select 100::integer;
 int4 
------
  100
(1 row)

postgres=# select pg_input_is_valid('Abcd','integer');
 pg_input_is_valid 
-------------------
 f
(1 row)

postgres=# select 'Abcd'::integer;
ERROR:  invalid input syntax for type integer: "Abcd"
LINE 1: select 'Abcd'::integer;
               ^

在发现转换失败的时候使用 pg_input_error_message()这个函数,将向我们提供错误消息。例如对上述的这个转换,我们不需要实际执行该转换,就可以通过函数,获取到转换的错误信息。这也避免了类型转换失败导致事务中断。文章来源地址https://www.toymoban.com/news/detail-526038.html

postgres=# select pg_input_error_info('Abcd','integer');
                     pg_input_error_info                     
-------------------------------------------------------------
 ("invalid input syntax for type integer: ""Abcd""",,,22P02)
(1 row)

到了这里,关于【PostgreSQL-16新特性之类型转换测试功能】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PostgreSQL是什么?它有什么功能和特性?它值不值得我们去学习?我们该如何去学习呢?

    PostgreSQL是一种开源的对象关系数据库管理系统(ORDBMS),它是一种高度可靠的数据库系统,具有丰富的功能和强大的性能。PostgreSQL的发展历史可以追溯到1986年,最初是由加拿大的计算机科学家Michael Stonebraker领导的一支研究小组开发的。PostgreSQL是一个强大的数据库系统,它

    2024年01月20日
    浏览(83)
  • PostgreSQL教程(四):高级特性

    在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识。现在我们将要讨论SQL中一些更高级的特性,这些特性有助于简化管理和防止数据丢失或损坏。最后,我们还将介绍一些PostgreSQL扩展。 本章有时将引用教程(三)中的例子并对其进行改变或改进以

    2024年02月21日
    浏览(38)
  • 【PostgreSQL】几个提高性能的小特性

    在PostgreSQL里,LOCALE默认使用C的本地化规则。LOCALE是一种文化偏好的区域设置,包括字母表、排序、数字格式等。 LOCALE里有一个比较重要的规则LC_COLLATE,即排序方式(Collation),它会对数据库行为有显著影响。 当数据库里运行一个like查询,DB上使用非C LOCALE,普通索引可能不支

    2024年02月13日
    浏览(41)
  • postgresql16 物理复制与逻辑复制的实现和对比

    本文面向想要练习 PostgreSQL 中数据库复制基础知识但可能无法访问远程服务器的初学者。我认为学习新技术时,在自己的机器上运行示例以巩固概念是至关重要的。对于副本来说,这可能很困难,因为许多可用的资源假设用户具有一定的 PostgreSQL 经验并且可以访问另一台运行

    2024年02月01日
    浏览(43)
  • PostgreSQL常见日期转换

    数据日期’${data_dt}’ 格式如:‘20230112’ 上日 本月初 本月末 上月末 上季末 上年末 去年同期 当年已过天数 EXTRACT日期转换 取月份 EXTRACT 的结果为duoble 类型无法参与运算,可以使用cast将 EXTRACT 的结果转为INT类型 当月第几天 当年第几周 当年第几月 本周第一天 本周末 本周第

    2024年02月16日
    浏览(45)
  • PostgreSQL PG16 逻辑复制在STANDBY 上工作 (译)

    开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共1100人左右 1 + 2 + 3)新人会进入3群 Postgres 16刚刚发布了测试版,我对其中

    2024年02月15日
    浏览(47)
  • PostgreSql 数据类型

    分类名称 说明 与其他数据库的对比 布尔类型 pg支持sql标准的boolean数据类型 与mysql中的bool、boolean类型相同,占用1字节存储空间 数值类型 2字节的smallint、4字节的integer、8字节的bigint、精确类型的小数numeric、非精确的浮点小数real和double precision、自增序列类型serial,bigserial、

    2024年02月12日
    浏览(42)
  • PostgreSQL 支持的字段类型

    PostgreSQL 支持多种字段类型,以下是 PostgreSQL 13 版本中支持的所有字段类型: 数值类型: smallint :小整数类型。 integer :整数类型。 bigint :大整数类型。 decimal :精确小数类型。 numeric :精确数字类型。 real :单精度浮点数类型。 double precision :双精度浮点数类型。 small

    2024年02月01日
    浏览(35)
  • PostgreSQL-数值类型

    数值类型是最常用的几种数据类型之一,主要分为: 整型 浮点型 精确小数 数值类型列表 类型名称 存储空间 描述 范围 smallint 2字节 小范围的整数。 Oracle中没有此数值类型,使用number代替 -2^15 ~ 2^15-1 int 或 integer 4字节 常用的整数。 Oracle中integer等同于number(38),与此类型的意

    2024年02月02日
    浏览(38)
  • PostgreSQL JSON 类型详解

    JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成 RFC 7159 中详述的键/值对和数组 使用 JSON 格式存储数据的主要原因之一是架构灵活性。当架构不稳定且频繁更改时,将数据存储在 JSON 中非常有用。如果将每个键存储为列,则会导致频繁的 DML 操作 - 当您的

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包