1

我有同样的问题

如何使用 SQL 在 Derby 中将 VARCHAR 自动截断为表字段长度?

再具体一点:

创建表 A ( B VARCHAR(2) ); 插入 AB 值('1234');会抛出一个 SQLException:

尝试将 VARCHAR '123' 缩小到长度 2 时遇到截断错误。

已经回答了:

不,你应该在检查元数据后把它砍掉。或者,如果您不想每次都检查元数据,那么您必须使代码和数据库保持同步。但这没什么大不了的,这是验证者的常见做法。

但我的疑问是:VARCHAR 不应该改变它的大小以适应数据吗?apache derby 的 VARCHAR 有什么问题?

4

2 回答 2

3

不,您所描述的与此无关: varchar 不会用空格填充, char 会用空格填充

所以如果你有

CREATE TABLE A ( B VARCHAR(20) ); INSERT INTO A B VALUES ('1234')

它将使用 4 个字节而不是 20 个字节,但是您不能在该列中容纳超过 20 个字符,要么在插入之前检查,要么使用类似 LEFT(val,2) 函数

但是话又说回来,您是否不想知道您的数据不合适并被截断。毕竟最重要的是您的数据……如果您的数据有问题,您将一无所有

在 SQL Server 中,您可以使用一个设置,它会为您执行此操作,请参阅Suppress string or binary data would be truncated messages with the ANSI WARNINGS setting

基本上你需要 SET ANSI_WARNINGS OFF 但我不知道这是否适用于你的数据库

于 2010-05-18T15:36:32.630 回答
3

VARCHAR 类型可变长度的,但您在其定义中提供的数字是您允许它拥有的最大字符数。

VARCHAR(2)将存储 0-2 个字符的值,CHAR(2)而不考虑它实际拥有的数据将存储 2 个字符。

旁注:一旦达到 255 个字符,请考虑改用该TEXT类型。

于 2010-05-18T15:45:16.103 回答