子串错误interbase
Substring error interbase
我在使用 Interbase 中的 substr
函数时遇到了一些问题 "a general SQL error arithmetic exception, numeric overflow or string truncation error".
select SUBSTR(note, 1, 150) note
from TABLE
备注字段是 varchar(8192)
,但我希望能够 return 仅前 150 个字符。我只能写内联 SQL 所以使用存储过程是不可能的。
Interbase 的最新版本似乎是 XE7,它的 documentation 内容为:
substr() returns the substring of starting at position and ending at position .
Note: This function can receive and return up to 80 characters, the limit on an InterBase character string.
所以溢出错误是因为您将 varchar(8192)
传递给接受 varchar(80)
的函数。您需要寻找一些其他的 UDF 库,它的 substr
版本没有这个限制。
我不确定这是否对你有很大帮助,但如果你有一个定义为 BLOB SUB_TYPE TEXT 的备注字段,你可以这样做
select cast(note as varchar(150)) from notes
不幸的是,我找不到在 varchar 字段上使用 CAST 将其转换为另一个更小的 varchar 的方法 - 我收到错误 "Arithmetic error, numeric overflow or string truncation"
当然,将 varchar(8192) 转换为 blob 似乎是不可能的,然后您可以像上面那样将其转换为 varchar!不知道是IB的SQL.
设计的无能还是bloody-mindedness
更奇怪的是,您可以将 BLOB 计算列添加到具有 varchar(8192) 注释列的 table,如
CREATE TABLE "NOTES3"
(
"ID" INTEGER,
"NOTE" VARCHAR(8192),
"NOTEBLOB" COMPUTED BY (Note)
);
但是如果您随后尝试通过
访问 NOTEBLOB 列
select cast(noteblob as varchar(150)) from notes3
你回到了 "Arithmetic error, numeric overflow or string truncation"。
如果您使用的是 Firebird 2.x+,那么您应该使用
select SUBSTRING(note FROM 1 FOR 150) note
from TABLE
如果字段注释是 BLOB,这将是 return BLOB 类型。
您也可以尝试将结果转换为 varchar。
select cast(SUBSTRING(note FROM 1 FOR 150) as varchar(150)) note
from TABLE
我不知道这是否也适用于 Interbase。
我在使用 Interbase 中的 substr
函数时遇到了一些问题 "a general SQL error arithmetic exception, numeric overflow or string truncation error".
select SUBSTR(note, 1, 150) note
from TABLE
备注字段是 varchar(8192)
,但我希望能够 return 仅前 150 个字符。我只能写内联 SQL 所以使用存储过程是不可能的。
Interbase 的最新版本似乎是 XE7,它的 documentation 内容为:
substr() returns the substring of starting at position and ending at position . Note: This function can receive and return up to 80 characters, the limit on an InterBase character string.
所以溢出错误是因为您将 varchar(8192)
传递给接受 varchar(80)
的函数。您需要寻找一些其他的 UDF 库,它的 substr
版本没有这个限制。
我不确定这是否对你有很大帮助,但如果你有一个定义为 BLOB SUB_TYPE TEXT 的备注字段,你可以这样做
select cast(note as varchar(150)) from notes
不幸的是,我找不到在 varchar 字段上使用 CAST 将其转换为另一个更小的 varchar 的方法 - 我收到错误 "Arithmetic error, numeric overflow or string truncation"
当然,将 varchar(8192) 转换为 blob 似乎是不可能的,然后您可以像上面那样将其转换为 varchar!不知道是IB的SQL.
设计的无能还是bloody-mindedness更奇怪的是,您可以将 BLOB 计算列添加到具有 varchar(8192) 注释列的 table,如
CREATE TABLE "NOTES3"
(
"ID" INTEGER,
"NOTE" VARCHAR(8192),
"NOTEBLOB" COMPUTED BY (Note)
);
但是如果您随后尝试通过
访问 NOTEBLOB 列select cast(noteblob as varchar(150)) from notes3
你回到了 "Arithmetic error, numeric overflow or string truncation"。
如果您使用的是 Firebird 2.x+,那么您应该使用
select SUBSTRING(note FROM 1 FOR 150) note
from TABLE
如果字段注释是 BLOB,这将是 return BLOB 类型。
您也可以尝试将结果转换为 varchar。
select cast(SUBSTRING(note FROM 1 FOR 150) as varchar(150)) note
from TABLE
我不知道这是否也适用于 Interbase。