Oracle的varchar2(4000)插入汉字过长
2013-03-20 09:01
375 查看
在使用oracle时,如果在一个varchar2(4000)的字段上插入的字符过长(一般只能插入666个汉字,视字符集不同会有所不同),经常回报“数据库异常错误”,具体报错会因驱动版本不同而不同。
原因一:
666 汉字所用的编码里 (可能是 UTF8) 每个字占了 3 bytes,当存的时候, 没有作好 charset-encoding 的转换,造成你的每个 byte 被当成是 java 的一个 char (2 bytes) 来存,这时,每个汉字要用 3x2=6 bytes
存进 oracle 中,所以最多只能存到 4000/6=666 字。
原因二:
这是个OracleJDBC问题。一般直接用ps.setString()设置字符串数据时,Oracle的JDBC驱动会将中文转换为2字节或3字节,不固定的,因此经常会越界。如果改为ps.setCharacterStream()就是固定的每个中文两个字节。
解决办法:
方法一:
使用ps.setCharacterStream()插入多个字符:
原来的代码
//ps.setString(i, ((String) parameter));
String s = (String) parameter;
ps.setCharacterStream(i, new StringReader(s), s.length());
方法二:
不用PreparedStatement,而直接组成sql语句插入。
方法三:
用CLOB字段来解决。
原因一:
666 汉字所用的编码里 (可能是 UTF8) 每个字占了 3 bytes,当存的时候, 没有作好 charset-encoding 的转换,造成你的每个 byte 被当成是 java 的一个 char (2 bytes) 来存,这时,每个汉字要用 3x2=6 bytes
存进 oracle 中,所以最多只能存到 4000/6=666 字。
原因二:
这是个OracleJDBC问题。一般直接用ps.setString()设置字符串数据时,Oracle的JDBC驱动会将中文转换为2字节或3字节,不固定的,因此经常会越界。如果改为ps.setCharacterStream()就是固定的每个中文两个字节。
解决办法:
方法一:
使用ps.setCharacterStream()插入多个字符:
原来的代码
//ps.setString(i, ((String) parameter));
String s = (String) parameter;
ps.setCharacterStream(i, new StringReader(s), s.length());
方法二:
不用PreparedStatement,而直接组成sql语句插入。
方法三:
用CLOB字段来解决。
相关文章推荐
- Oracle的varchar2(4000)插入汉字过长
- varchar(16)在mysql和oracle中分别能插入多少汉字
- oracle 字段长度设置为varchar2(4000),就一定可以存放2000个汉字吗?
- Oracle数据库的varchar2(2)存储一个汉字时提示插入汉字过长问题
- oracle的varchar2(4000)可以存储2000个汉字或者4000个英文字符? .
- Oracle数据库的varchar2(2)存储一个汉字时提示插入汉字过长问题
- oracle的varchar2(4000)通过jdbc的thin驱动连接为什么只可以存666个汉字 .
- [急]Oracle Clob字段插入数据库时报:字符串长度过长
- char nchar varchar2 nvarchar2 区别-Oracle (varchar2 max 4K, 2K汉字)
- Oracle clob类型如何插入4000字符数据
- Oracle的varchar2类型最大长度为4000, PLSQL的varchar2最大长度为32762
- Oracle 插入超4000字节的CLOB字段的处理方法
- 关于用php插入汉字到oracle中出现不乱码问题
- asp插入超过4000字符到ORACLE中
- Oracle 改写listagg 4000 varchar 的限制的方法 clob
- Oracle 插入超4000字节的CLOB字段的处理方法
- 解决字符串插入不能大于2000.(用的数据库环境为Oracle 9i; 10g不能大于4000)
- oracle 插入大于4000字符的 clob代码
- Linux下Oracle字符集问题引发的汉字插入失败解决方案
- Oracle 插入超4000字节的CLOB字段的处理方法