前段时间在做一登录模块时,遇到一个文本输入的问题。即,文本的最大值为40000,varchar2类型的,当输入的内容为40000时,却报错。后来查看一下才知道是oracle问题。
参考资料如下:
一、异常情况:
有了一定Java编程经验之后,一般都使用PreparedStatement代替Statement。
但实际开发中对数据库进行操作时,字段遇到大数据并且该字段为非BLOB,CLOB的类型时,若采用PreparedStatement方法setString方法时会如下异常: java.sql.SQLException: 数据大小超出此类型的最大值
实际数据库定义字段长度为:4000,而包装的数据内容长度只有1000左右
二、分析原因:
1、驱动程序在把SQL语句发给数据库前,PreparedStatement对字符串进行预处理并进行了转义替换;
2、字符集原因。
三、解决办法:
通过阅读PreparedStatement文档,setCharacterStream方法可以解决这个问题:
stmt.setCharacterStream(1,
new StringReader(String内容), String内容.length());
四、案例总结:
JDBC在转换过程中对字符串的长度做了限制。这个限制和数据库中字段的实际长度没有关系。而setCharacterStream()方法可以逃过字符转换限制,也就成为了解决此问题的方案之一。JDBC对转换字符长度的限制是为了转换过程中的数据扩展。根据实际测试结果,在ZHS16GBK字符集和thin驱动下,2000-4000长度的varchar字段都只能插入1333个字节(约666个汉字)。
故解决PreparedStatement的setString中字符串长度问题可以有两种办法:
1、使用setCharacterStream()方法;
2、使用OCI驱动连接Oracle数据库。
分享到:
相关推荐
两者都是用于执行SQL语句的接口,但PreparedStatement是Statement的子接口,它继承了Statement的所有方法,并添加了一些新的方法,如`setString()`、`setInt()`等来设置参数。 ##### 3.3 小结 使用...
类中的方法如`setString()`, `setInt()`, `setBoolean()`, `setDate()`, `setLong()`和`setFloat()`都是用来设置PreparedStatement中的参数值。这些方法对应于SQL语句中的问号占位符,允许我们在运行时动态地插入值...
`setBinaryStream()`则用于将文件流设置为第二个占位符的值,同时指定了文件流的长度。 ### 数据库中的文件下载 当需要从数据库中下载文件时,同样使用`PreparedStatement`来执行SQL查询语句,然后通过`ResultSet`...
例如,使用PreparedStatement方式查询数据时,需要将查询条件值与数据库中值进行完全匹配,否则将无法查到数据。例如,conn=getConnection();ps=conn.prepareStatement("select * from t_user where user_name=?");...
IMAGE类型可以存储任何长度的二进制数据,与MySQL的LONGBLOB类似。与MySQL相比,SQL Server在存取大对象时的API使用上没有显著差异,同样使用PreparedStatement的setBinaryStream和getBinaryStream方法。 ```java /...
可以使用正则表达式、长度限制等方法。 4. **使用ORM框架**:像Hibernate或MyBatis这样的ORM框架,它们通常内置了防止SQL注入的机制。 5. **限制数据库权限**:为Web应用的数据库连接分配最小权限,避免通过注入获取...
JDBC(Java Database Connectivity)是Java编程语言中用于...使用`setXXX()`方法(如`setString()`, `setInt()`),根据参数的位置(从1开始计数)和类型设置参数值,如`preparedStatement.setString(1, "username")`。
c) setInt和setString方法用于设置参数,没有错误;d) PreparedStatement类确实有executeUpdate()方法,用于执行DML语句。因此,所有描述都是错误的,没有正确答案。 5) Java 源代码编译与运行: 在命令行中,编译...
还可以限制输入长度,避免过长的字符串导致的潜在风险。 4. **转义特殊字符**: 对用户输入进行转义处理,将可能引起SQL语句解析错误的特殊字符(如单引号、双引号、分号等)转换为安全的表示形式。 5. **使用ORM...
public void closeAll(Connection conn, PreparedStatement pstmt, ResultSet res) { this.closeResultSet(res); this.closePreparedStatement(pstmt); this.closeConnection(conn); } private void close...
这里,`username`和`hashedPassword`是用户输入的值,通过设置占位符并调用`setString()`方法将它们绑定到SQL语句中。 【LabSite-Ver08】 这个文件名可能表示的是项目的一个版本号,表明这是一个名为LabSite的项目...
- **SQL注入**:使用PreparedStatement可以防止SQL注入攻击,因为它会自动转义特殊字符。 - **错误信息处理**:不要在页面上直接显示错误信息,以免泄露敏感信息,如“用户名不存在”可能暗示了用户名的有效性。 综...
可以限制输入长度、检查非法字符或使用正则表达式匹配合法格式。例如,只允许字母和数字的用户名: ```java String regex = "[a-zA-Z0-9]*"; if (!username.matches(regex)) { throw new IllegalArgumentException...
之后,通过setString等方法将参数传递给PreparedStatement对象。在查询执行时,传入的参数值被自动以参数化的方式处理,避免了SQL注入的风险。即使传入的参数中包含有SQL注入攻击代码,这部分代码也不会被当作SQL...
这里定义了一个名为`person`的表,其中`id`字段是主键,类型为`VARCHAR`长度32,不能为空;`name`和`password`字段类型同样为`VARCHAR`,长度分别为20。 #### 插入数据 使用`INSERT INTO`语句向表中插入数据,如: ...
由于`PreparedStatement`在执行查询之前会预编译SQL语句,所以即使输入包含SQL关键字,它们也会被视为普通字符串,不会被解释为SQL命令,从而避免了注入攻击。 除了使用`PreparedStatement`之外,还有其他防护措施...
5. **设置参数并执行插入操作**:通过调用`setString()`、`setInt()`以及`setBinaryStream()`方法设置SQL语句中的参数,并最终调用`executeUpdate()`方法执行插入操作。 6. **关闭资源**:完成所有操作后,关闭`...
通过调用`setString()`、`setInt()`和`setBinaryStream()`方法来设置`PreparedStatement`对象的参数值。其中,`setBinaryStream()`方法接收一个输入流和文件长度作为参数,将图片数据写入数据库。 ### 四、异常处理...
- 输入验证:对用户输入进行校验,限制长度、类型和格式,拒绝不符合规则的输入。 - 使用过滤器(Filter):在请求到达业务层之前,通过HTTP Filter检查和清理请求参数,消除潜在的SQL注入风险。 4. Java Filter...
对用户的输入进行严格的验证,比如限制输入长度、检查输入格式等。这可以通过前端表单验证和后端数据验证相结合的方式来实现。 ```java public static String filterContent(String content) { String[] filter = ...