`

Oracle的varchar2(4000)插入汉字过长

阅读更多
在使用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字段来解决。
分享到:
评论

相关推荐

    oracle中varchar2(byte)和varchar2(char).doc

    在Oracle数据库中,`VARCHAR2`是最常用的字符数据类型之一,用于存储变长的字符串。然而,在定义`VARCHAR2`类型时,可以选择指定长度为`BYTE`或`CHAR`。这两种方式看似细微的差别,实际上却对数据存储、性能优化以及...

    Oracle接收长度大于4000的字符串

    在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...

    Oracle10g US7ASCII 编码中文无法导入sqlserver问题解决

    - **RAW 和 VARCHAR2 格式**:RAW 是 Oracle 中存储二进制数据的一种格式,VARCHAR2 则是存储变长字符串的格式。通过将数据先转换为 RAW 再转换回 VARCHAR2,可以绕过编码问题。 - **DBLink**:Oracle 中的数据库...

    oracle 中几种字符类型

    VARCHAR2 是 Oracle 自己定义的一个非工业标准 VARCHAR,不同在于,VARCHAR2 用 NULL 代替 VARCHAR 的空字符串。 三、NVARCHAR 类型 NVARCHAR 类型是可变长度的 Unicode 字符类型,长度可以变化,例如 NVARCHAR(20...

    Oralce中VARCHAR2()与NVARCHAR2()的区别介绍

    在Oracle数据库中,VARCHAR2()和NVARCHAR2()都是用于存储字符数据的变量长度数据类型,但它们之间存在显著的差异。以下是对这两个数据类型的详细解释: 1. VARCHAR2() VARCHAR2() 是Oracle中的标准可变长度字符...

    Oracle 数据库多语言入库问题的解决方案

    默认字符集用于CHAR、VARCHAR、VARCHAR2、CLOB等类型的数据,而国家字符集服务于NCHAR、NVARCHAR、NVARCHAR2、NCLOB等类型,以处理多语言需求。例如,当数据库的默认字符集为ZHS16GBK,国家字符集为AL16UTF16时,...

    oracle中文基本操作教程

    1. 数据类型:Oracle支持多种数据类型,如CHAR、VARCHAR2(可变长度字符串)、NUMBER(数字)、DATE(日期)等。了解这些数据类型有助于正确创建和管理表。 2. 创建表:使用CREATE TABLE语句来创建表,例如: ```...

    Oracle Sql基础(beginning oracle sql中文版)

    Oracle SQL支持多种数据类型,如CHAR、VARCHAR2(可变长度字符串)、NUMBER(数字)、DATE(日期时间)、CLOB(大对象,用于存储文本)、BLOB(大对象,用于存储二进制数据)等。选择正确的数据类型对于数据的存储和...

    oracle数据库中汉字排序方法

    ### Oracle数据库中汉字排序方法 在Oracle数据库中处理中文数据时,经常需要对包含中文字符的数据表...通过以上内容的学习与实践,我们可以有效地在Oracle数据库中实现汉字排序功能,从而更好地管理和利用中文数据。

    Oracle存储过程-1.docx

    因此,一个VARCHAR2(10)的列可以存储2个汉字,因为每个汉字占用2字节,总共不超过4000字节。 在Oracle中,数据类型的长度单位是字节,这意味着在规划表结构时,需要考虑到字符集和可能的多字节字符。使用DUMP函数...

    oracle 教程 中文教程 数据库 教程

    ### Oracle 教程:中文教程与数据库教程 #### 前言 Oracle 是一款非常流行的数据库管理系统,在企业和大型组织中广泛使用。对于那些处理大量数据的系统而言,Oracle 提供了丰富的工具和技术来优化性能。本文将重点...

    oracle数据类型总结PPT

    例如,插入一个中文字符到`VARCHAR2`字段中,如果使用的是UTF8字符集,该字符可能会占用两个字节;而在`NVARCHAR2`字段中,它将按单个字符计算,不论字符集。 接下来是二进制串类型,包括`RAW`,`BLOB`,以及已过时...

    oracle入门很简单06.zip

    1. VARCHAR2:这是Oracle中最常用的变长字符类型,它可以存储0到32767个字符。VARCHAR2节省空间,因为只存储实际输入的字符数,但长度是不固定的,这可能会导致排序和索引的问题。 2. CHAR:这是一种定长字符类型,...

    ORACLE常用的SQL命令

    - 对于长文本,超过4000字节的限制,可以使用CLOB类型,并借助DBMS_LOB包进行操作。 - 序列号:通过`CREATE SEQUENCE`创建自增序列,如`CREATE SEQUENCE 序列号的名称 INCREMENT BY 1 START WITH 1 MAXVALUE 99999...

    Oracle的SQL语法大全

    Oracle支持多种数据类型,如`CHAR`、`VARCHAR2`、`NUMBER`和`DATE`。创建表时,小字段在前,可空字段在后,中文字段名虽可行,但推荐使用英文。可以设置默认值和约束,如`DEFAULT`和`UNIQUE`、`PRIMARY KEY`。 2. *...

Global site tag (gtag.js) - Google Analytics