help: 位串类型 [编辑] 位串类型位串就是一串 1 和 0 的字串。它们可以用于存储和视觉化位掩码。我们有两种类型的 SQL 位类型:bit(n) 和 bit varying(n); 这里的 n是一个正整数。 bit类型的数据必须准确匹配长度n; 试图存储短些或者长一些的数据都是错误的。类型 bit varying 数据是最长 n 的变长类型; 更长的串会被拒绝。写一个没有长度的 bit 等效于 bit(1),没有长度的bit varying 意思是没有长度限制。 注意:如果我们明确地把一个位串值转换成 bit(n), 那么它的右边将被截断或者在右边补齐零,直到刚好 n 位, 而不会抛出任何错误。类似地,如果我们明确地把一个位串数值转换成 bit varying(n),如果它超过了n 位, 那么它的右边将被截断。 注意:在PostgreSQL7.2 之前,不管是否有明确的转换, bit 都会在右边自动截断或者在在右边填充零的。这个行为现在已经为了和SQL标准兼容修改过来了。 请参考 Section 4.1.2.3 获取有关位串常量的语法的信息。还有一些位逻辑操作符和位处理函数可用; 见Section 9.6。 例 8-3. 使用位串类型
CREATE TABLE test (a bit(3), b bit varying(5)); INSERT INTO test VALUES (B'101', B'00'); INSERT INTO test VALUES (B'10', B'101'); ERROR: Bit string length 2 does not match type bit(3) INSERT INTO test VALUES (B'10'::bit(3), B'101'); SELECT * FROM test; a | b -----+----- 101 | 00 100 | 101
这个有式过吗? insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,?::BIT VARYING(8),?)";bit类型的输入可用字符串或整型代替, 但在SQL语句一定要来个显示转换 显示转换的格式为 XXX::类型 或 cast(xxx as 类型)
麻烦你把这个insert语句写详细一点!谢谢!
你的SQL语句是参数化语句, 有6个?, JDBC会解析的, 所以才要下面的6个setxxx不知jdbc解析得了这个语句的第5个?参数 insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,?::BIT VARYING(8),?);假如解析不了,换成 insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,cast(? as BIT VARYING(8)),?);如果还是解析不了, 第5个变量就不要参数化, 直接把值嵌入SQL语句 String sql="insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,"+ ispass?"1":"0"+"::BIT VARYING(8),?)";
还是改变使用boolean类型
org.postgresql.util.PSQLException: 错误: 无法把类型 integer 转换为 bit varying
from tb
如 B'1010', 也可以用其他类型再进行个显示转换, 如:
44::bit(10), '01110'::bit(10)等但不知你的接口ODBC或ADO等有没有封装bit类型,假如没封装, 那就其他类型代替, 在写SQL语句时进行显示转换
位串类型
[编辑]
位串类型位串就是一串 1 和 0 的字串。它们可以用于存储和视觉化位掩码。我们有两种类型的 SQL 位类型:bit(n) 和 bit varying(n); 这里的 n是一个正整数。 bit类型的数据必须准确匹配长度n; 试图存储短些或者长一些的数据都是错误的。类型 bit varying 数据是最长 n 的变长类型; 更长的串会被拒绝。写一个没有长度的 bit 等效于 bit(1),没有长度的bit varying 意思是没有长度限制。
注意:如果我们明确地把一个位串值转换成 bit(n), 那么它的右边将被截断或者在右边补齐零,直到刚好 n 位, 而不会抛出任何错误。类似地,如果我们明确地把一个位串数值转换成 bit varying(n),如果它超过了n 位, 那么它的右边将被截断。
注意:在PostgreSQL7.2 之前,不管是否有明确的转换, bit 都会在右边自动截断或者在在右边填充零的。这个行为现在已经为了和SQL标准兼容修改过来了。 请参考 Section 4.1.2.3 获取有关位串常量的语法的信息。还有一些位逻辑操作符和位处理函数可用; 见Section 9.6。
例 8-3. 使用位串类型
CREATE TABLE test (a bit(3), b bit varying(5));
INSERT INTO test VALUES (B'101', B'00');
INSERT INTO test VALUES (B'10', B'101');
ERROR: Bit string length 2 does not match type bit(3)
INSERT INTO test VALUES (B'10'::bit(3), B'101');
SELECT * FROM test;
a | b
-----+-----
101 | 00
100 | 101
statement=conn.prepareStatement(sql);
statement.setString(1, username);
statement.setString(2, tablename);
statement.setLong(3, report_id);
statement.setTimestamp(4, Timestamp.valueOf(datetime));
//statement.setInt(5, ispass?1:0);
statement.setBoolean(5, ispass);
statement.setString(6, re);
statement.execute();报错:
org.postgresql.util.PSQLException: 错误: 字段 "is_pass" 的类型为 bit, 但表达式的类型为 boolean
建议:你需要重写或转换表达式
位置:104
高手快来!!!
insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,?::BIT VARYING(8),?)";bit类型的输入可用字符串或整型代替, 但在SQL语句一定要来个显示转换
显示转换的格式为 XXX::类型 或 cast(xxx as 类型)
麻烦你把这个insert语句写详细一点!谢谢!
insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,?::BIT VARYING(8),?);假如解析不了,换成
insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,cast(? as BIT VARYING(8)),?);如果还是解析不了, 第5个变量就不要参数化, 直接把值嵌入SQL语句
String sql="insert into t_sign_log(sign_user,tablename,sign_report_id,sign_date,is_pass,re) values(?,?,?,?,"+
ispass?"1":"0"+"::BIT VARYING(8),?)";
org.postgresql.util.PSQLException: 错误: 无法把类型 integer 转换为 bit varying