【问题标题】:Inserting Data into DB ERROR: Columns of type 'VARCHAR' cannot hold values of type 'INTEGER'将数据插入 DB 错误:“VARCHAR”类型的列不能保存“INTEGER”类型的值
【发布时间】:2018-11-19 04:50:05
【问题描述】:

我已经建立了一个数据库,现在我正在编写一个将数据插入该数据库的函数。 我想问题是我没有看到的,我得到的错误是:

“VARCHAR”类型的列不能保存“INTEGER”类型的值。

虽然我完全理解这意味着什么,但我就是无法让它发挥作用。

这是我的插入代码:

public static void insertIntoCouponsDB(long COMPANY_ID, String TITLE, String START_DATE, String END_DATE, int AMOUNT, String TYPE, String MESSAGE, double PRICE, String IMAGE) throws SQLException {

    Connection connection = DriverManager.getConnection(connectionString);

    String sql = String.format("insert into Coupons (COMPANY_ID, TITLE, START_DATE,END_DATE,AMOUNT,TYPE,MESSAGE,PRICE,IMAGE) values (%d, '%s', '%s','%s',%d,'%s','%s',%.2f,'%s')",COMPANY_ID,TITLE,START_DATE,END_DATE,AMOUNT,TYPE,MESSAGE,PRICE,IMAGE);

    PreparedStatement preparedStatement = connection.prepareStatement(sql, PreparedStatement.RETURN_GENERATED_KEYS);

    preparedStatement.executeUpdate();

    ResultSet resultSet = preparedStatement.getGeneratedKeys();

    resultSet.next();

    int id = resultSet.getInt(1);

    System.out.println("Insertion into Coupons DONE !!! New ID: " + id);

}

}

这是创建tabke的代码:

public static void buildCouponsDB() {

    try {
        Connection connection = DriverManager.getConnection(connectionString);
        Statement statement = connection.createStatement();



        String sql = "create table Coupons (" +
                "ID bigint not null primary key " + 
                "generated always as identity(start with 1, increment by 1), "+
                "COMPANY_ID bigint not null, "+
                "TITLE varchar(50) not null, "+
                "START_DATE date not null, "+
                "END_DATE date not null, "+
                "AMOUNT integer not null, "+
                "TYPE varchar(50) not null, "+
                "MESSAGE varchar(250) not null, "+
                "PRICE double not null, "+
                "IMAGE varchar(100) not null)";


        statement.executeUpdate(sql);
        System.out.println("Coupons Table has been Created Succesfully !!");

    } catch (Exception ex) {
        System.out.println(ex.getMessage());
    }

}

有人可以帮忙吗? 如果问题很简单,我很抱歉,但仍然寻求帮助。提前致谢。

【问题讨论】:

标签: java sql jdbc derby


【解决方案1】:

似乎 DerbyDB 不支持从整数到 varchar 数据类型的隐式转换,就像许多(大多数?)其他数据库一样。
the documentation 的快速回顾没有提供有关隐式转换的任何信息。

CAST 函数 CAST ( [ expression | NULL | ? ] AS dataType ),但从文档中的表格看来,不支持从所有数字数据类型(SMALLINT、INTEGER、BIGINT、DECIMAL 等)进行转换。

幸运的是,还有另一个 [CHAR(https://db.apache.org/derby/docs/10.14/ref/rrefbuiltchar.html) 函数,看来这个函数可以用来将数值转换为 varchar 数据类型:

整数转字符语法

CHAR(整数表达式)

整数表达式

返回值的表达式 整数数据类型(SMALLINT、INTEGER 或 BIGINT)。结果是 参数的字符串表示形式,形式为 SQL 整数常量。结果由 n 个字符组成,它们是 表示参数值的有效数字 如果参数为负,则在前面的减号。结果留下 有道理。

  • 如果第一个参数是 SMALLINT:结果的长度是 6。如果 结果中的字符数小于6,则结果 在右侧用空格填充到长度 6。
  • 如果第一个参数 是整数:结果的长度是 11。如果 结果中的字符小于 11,然后填充结果 右边有空格,长度为 11。
  • 如果第一个参数是 BIGINT: 结果的长度为 20。如果 结果小于 20,则结果在右侧填充 长度为 20 的空白。

因此您必须使用 CHAR 函数将数字转换为 VARCHAR 数据类型

我使用ij derby 客户端进行的快速测试表明上述情况属实:

ij> connect 'jdbc:derby://localhost:1527/myDB;create=true'
> ;
ij> create table x( x integer, y varchar(20) );
0 wierszy wstawionych/zaktualizowanych/usuniŕtych

ij> insert into x values( 1,1);
BúąD 42821: Kolumny typu 'VARCHAR' nie mog╣ przechowywaŠ wartoťci typu 'INTEGER'.

ij> insert into x values( 1, cast(1 as varchar));
BúąD 42X01: B│╣d sk│adniowy: Encountered ")" at line 1, column 43.
Issue the 'help' command for general information on IJ command syntax.
Any unrecognized commands are treated as potential SQL commands and executed directly.
Consult your DBMS server reference documentation for details of the SQL syntax supported by your server.

ij> insert into x values( 1, char(1));
1 wiersz wstawiony/zaktualizowany/usuniŕty
ij> commit;
ij> select * from x;
X          |Y
--------------------------------
1          |1

1 wiersz wybrany
ij>

编辑


看来CAST( 1 AS CHAR )也可以,我做了测试:

ij> insert into x values( 1, cast(1 as char));
1 wiersz wstawiony/zaktualizowany/usuniŕty
ij>

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-01
相关资源
最近更新 更多