问题描述
我正在尝试使用单个查询在相应的表中查询字段名称及其最大长度 - 是否可能?我已经阅读了相关子查询,但我无法得到想要的结果。
这是我目前的查询:
select T1.RDB$FIELD_NAME,T2.RDB$FIELD_NAME,T2.RDB$RELATION_NAME as tabName,T1.RDB$CHaraCTER_SET_ID,T1.RDB$FIELD_LENGTH,(select max(char_length(T2.RDB$FIELD_NAME))
FROM tabName as MaxLength)
from RDB$FIELDS T1,RDB$RELATION_FIELDS T2
以上不起作用,因为,当然,这里子查询试图找到“tabName”表。我的猜测是我应该使用某种连接,但我的 sql 技能在这方面非常有限。
请求的起源是我想应用 this script 以便将我所有的非 utf8 字段转换为 UTF8 但我遇到了“字符串截断”问题,因为我有一些 `VARCHAR(8192 )' 字段会导致脚本出现字符串截断错误。通常,没有一个字段会实际使用这些 8192 个字符,但我宁愿在截断之前确定。
解决方法
您尝试做的事情无法通过这种方式完成。看起来你想获取表中字段的实际最大长度,但是你不能像这样动态引用表名和列名;能够做到这一点将是 SQL 注入的天堂。此外,您使用 SQL-89 交叉连接而不是内部连接(最好是 SQL-92 样式)会导致其他问题,因为您将错误地组合字段(作为笛卡尔积)。
相反,您需要编写 PSQL 来动态构建和执行语句以获取长度(使用 EXECUTE BLOCK
(或存储过程)和 EXECUTE STATEMENT
)。
例如,像这样:
ngOnInit(): void {
this.socialAuthService.authState.subscribe((user) => {
this.user = user;
localStorage.setItem('googleUserName',JSON.stringify(this.user?.name));
this.myStore = localStorage.getItem('googleUserName')
})
if(localStorage.getItem('googleUserName')) {
this.myStore = localStorage.getItem('googleUserName')
this.newUser = JSON.parse(this.myStore);
this.user = {
"name": this.newUser
}
}
}
// google signout
signOutWithGoogle() {
localStorage.clear()
this.socialAuthService.signOut()
}
顺便说一句,UTF8 字符集的 VARCHAR 的最大长度是 8191,而不是 8192。