目录
- Q1. 为什么psql连接数据库区分大小写呢
- Q2. Sybase的系统函数len(char)与pg的系统函数length(char)对char类型处理的差异
- Q3. 可以查到访问表的最后访问时间吗?
- Q4. 如何查看某个存储过程中涉及到的表、索引等对象呢
- Q5. pg_class.reltablespace 中的值为0?
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类型尾部的空格

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


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

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;

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

- 使用默认表空间时,表对应的
pg_class.reltablespace = 0





