PostgreSQL标识符长度限制不能超过63字节

文章目录


问题:标识符太长会被截断

在创建表时,发现表名太长会自动被截断,导致查询表时报错了。

分析

参考:https://www.postgresql.org/docs/current/limits.html

Item Upper Limit Comment
identifier length 63 bytes can be increased by recompiling PostgreSQL

PostgreSQL里面限制标识符(库名、表名等)长度不能超过63个字节,虽然这个参数可以在编译时修改,但是一般都不会去修改(63其实已经够用了,相当于6个长的单词,如果这都说不清楚,那么建议用简称+comment的模式)。

相关源码

实际上定义的变量NAMEDATALEN为64,但是C语言字符串结尾字符 \0 占一个字节,所以用的时候使用 NAMEDATALEN-1来进行判断的,即63。

源码详见:src\interfaces\ecpg\include\sqlda-native.h

在线可参考:https://github.com/postgres/postgres/blob/master/src/interfaces/ecpg/include/sqlda-native.h#L8-L16

c 复制代码
/*
 * Maximum length for identifiers (e.g. table names, column names,
 * function names).  Names actually are limited to one fewer byte than this,
 * because the length must include a trailing zero byte.
 *
 * This should be at least as much as NAMEDATALEN of the database the
 * applications run against.
 */
/*
 * 标识符的最大长度(例如表名、列名、函数名)。 名称实际上限制为比此少一个字节,因为长度必须包括一个尾随的零字节。
 *
 * 这至少应该与应用程序运行所针对的数据库的 NAMEDATALEN 一样多。
 */
#define NAMEDATALEN 64

可以尝试以下案例

sql 复制代码
-- 如果超过63(>63,可以为63)会被自动截断,会有提示(NOTICE),但是不会报错
SELECT repeat('d', 64);
create database dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd;
-- > NOTICE:  identifier "dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd" will be truncated to "ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"
SELECT length(datname),* from pg_database;
-- 63	ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd

ps:注意这里的63是字节,如果是中文的话是21个中文,但是强烈不推荐使用中文标识符。

相关推荐
Menior_17 分钟前
【补充】数据库中有关系统编码和校验规则的简述
数据库·mysql·oracle
晴子呀1 小时前
分库分表和sql的进阶用法总结
数据库·sql
编程(变成)小辣鸡1 小时前
Redis 知识点与应用场景
数据库·redis·缓存
Kay_Liang1 小时前
从聚合到透视:SQL 窗口函数的系统解读
大数据·数据库·sql·mysql·数据分析·窗口函数
H2122021651 小时前
SQLite3库链接与加载问题解决方案
数据库·oracle·sqlite
IT毕设实战小研1 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计
倔强的石头_1 小时前
KingbaseES高可用架构深度解析——从读写分离到异地灾备的全方位守护
数据库
范纹杉想快点毕业3 小时前
嵌入式 C 语言编程规范个人学习笔记,参考华为《C 语言编程规范》
linux·服务器·数据库·笔记·单片机·嵌入式硬件·fpga开发
诺亚凹凸曼3 小时前
MySQLinnodb引擎普通索引和唯一索引的区别
数据库·mysql
davawang4 小时前
程序自动化vs人工手动处理
数据库·数据分析·企业文化