暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

PostgreSQL问答-第20230312期

原创 Maleah 2023-03-12
911

目录

Q1. 为什么psql连接数据库区分大小写呢?

  • 命令行工具 createdb、createuser 区分大小写
$ createdb DB_test 
$ psql 
psql (15.0)
Type "help" for help.

postgres=# \l "DB_test"
                                              List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider | Access privileges 
---------+----------+----------+-------------+-------------+------------+-----------------+-------------------
 DB_test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
(1 row)

postgres=# 
  • sql 语句不区分大小写
postgres=# create database Test_DB ;
CREATE DATABASE
postgres=# \l Test_DB
                                              List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    | ICU Locale | Locale Provider | Access privileges 
---------+----------+----------+-------------+-------------+------------+-----------------+-------------------
 test_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |            | libc            | 
(1 row)

postgres=# \q
  • psql 连接数据库区分大小写
$ psql -d test_DB
psql: error: connection to server on socket "/tmp/.s.PGSQL.5555" failed: FATAL:  database "test_DB" does not exist
$ psql -d test_db
psql (15.0)
Type "help" for help.

test_db=# \q

Q2. Sybase的系统函数len(char)与pg的系统函数length(char)对char类型处理的差异

问题描述

在一个Sybase迁移PostgreSQL的项目,对char类型通过jdbc查询字段的值以及字段的长度进行对比时,从Sybase数据库使用len函数统计长度时包含char类型尾部的空格,从PostgreSQL使用length函数统计长度时不包含char类型尾部的空格。 这样导致数据比对不一致。

问题解答
  • Sybase中,使用len函数统计长度时包含char类型尾部的空格

image.png image-20230312191647880

  • PostgreSQL 中,如果是char类型,则不包含尾部的空格;字符串"abcd "如果是varchar类型,则length函数会计算尾部的空格

    image.pngimage-20230312192018185

如果要获取它的实际存储长度,应该用octet_length()函数。
image-20230312192030903

Q3. 如何能查到表的最后访问时间呢?

问题描述

在PostgreSQL中,可以查到访问表的最后访问时间吗?

问题解答

可以通过 pg_stat_file()函数来查看,用来返回关于一个文件的信息

pg_stat_file返回一个记录,其中包含文件尺寸、最后访问时间戳、最后修改时间戳、最后文件状态改变时间戳(只支持 Unix 平台)、文件创建时间戳(只支持 Windows)和一个boolean指示它是否为目录。

postgres=# select * from pg_stat_file(pg_relation_filepath('t')) \gx
-[ RECORD 1 ]+-----------------------
size         | 3629056
access       | 2023-03-12 19:08:30+08
modification | 2022-11-27 21:33:30+08
change       | 2022-11-27 21:33:30+08
creation     | 
isdir        | f

注意:此函数只是记录该表对应数据文件的访问时间,如果查找的数据来自于数据库buffer,则不计入

Q4. 如何查看某个存储过程中涉及到的表、索引等对象呢?

问题描述

在PostgreSQL数据库中,如何查看某个存储过程中,涉及到那些对象,例如表,索引等等

问题解答

版本14开始,如果使用begin atomic语法创建新形式的函数或存储过程,则可以从pg_depend中查到依赖关系。

Demo如下

# 创建表
CREATE TABLE test(id int,info text);

# 使用begin atomic语法创建新形式的函数或存储过程,创建依赖表的函数
CREATE OR REPLACE FUNCTION public.f_test()
 RETURNS character varying
  LANGUAGE sql
begin atomic;
    select info from test limit 1;
end;

查询函数f_test依赖的表对象:

SELECT refobjid::regclass,refobjsubid 
  FROM pg_depend 
WHERE objid='function_name'::regproc 
  AND refclassid='pg_class'::regclass;

image-20230312191413245

refobjsubid字段是依赖test表的具体第几个列

问题来源:https://www.modb.pro/issue/25103

往期回顾:获取表上依赖于该表的视图

Q5. pg_class.reltablespace 中的值为0?

问题描述

在PostgreSQL数据库的默认表空间在pg_class中reltablespace 记录的是0?在pg_tablespace表中oid却又不是0,这两个表的这两列的关系应该是对应的吧?

问题解答

pg_class.reltablespace:表示该relation所存储的表空间。对应的是pg_tablespace.oid,如果为0,表示使用数据库的默认表空间

  • 创建自定义表空间时,pg_class.reltablespace = pg_tablespace.oid
    image.png
  • 使用默认表空间时,表对应的pg_class.reltablespace = 0
    image.png
最后修改时间:2023-03-13 16:05:55
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论