oracle 的varchar2(4000)通过jdbc的thin驱动连接为什么只可以存666个汉字?
谁说只能存储666个汉字的?
varchar2最大是4000字节,那么就看你的oracle字符集,如果字符集是16位编码的,ZHS16GBK,那么每个字符16位,2字节,所以可以容纳2000字符。 如果是32位编码的字符集,那么只能存储 1000个字符。
从后面的例子的 length(字符长度)和lengthb(字节长度)的差别就可以看出来了。 create table T_BOARD( NAME VARCHAR2(50)
insert into T_BOARD values ('测试');
select t.name,length(t.name),lengthb(t.name) from t_board t
字符集合决定varchar2的长度
问题描述: intert into T_BOARD values('超过17个汉字'); 报错:插入字符过长!发现一个汉字占3个字节,所以报错!!!
问题所在: 使用的字符集是UTF8,就有可能出现这个错误! 使用命令查看:
SQL> select parameter,value from nls_database_parameters where parameter like 'NLS_CHARACTERSET';
PARAMETER ------------------------------------------------------------ VALUE -------------------------------------------------------------------------------- NLS_CHARACTERSET AL32UTF8
解决方法: 建议使用ZHS16GBK字符集! 操作: SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP MOUNT; SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL> ALTER DATABASE OPEN; SQL> ALTER DATABASE CHARACTER SET AL32UTF8/ZHS16GBK;
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP; 问题解决!!! (改变时注意新的字符集是旧的超集问题)
附注1:
|
Re: 研究:为什么我的ORACLE的数据操作突然报数量限制的错误(怪)? |
发表时间: 2003-12-05 09:25 |
|
这是很经典的OracleJDBC问题。一般直接用ps.setString()设置字符串数据时,Oracle的JDBC驱动会将中文转换为2字节或3字节,不固定的,因此经常会越界。 如果你改为ps.setCharacterStream()就是固定的每个中文两个字节
|
根据oracle的文档,thin的jdbc驱动,会根据字符集合决定varchar2的长度,如果不是ascii或者拉丁字符集合,长度的限制就是2000,因为它认为其他字符集都需要两个字节来存储,但是通过jdbc的setString方法时候,驱动会把java的utf-16转换为utf-8,这样英文由两个字节变成一个字节,中文由两个字节变为3个字节,所以2000/3大概就是666个中文字符了。
附注2:
在做更新操作时,办法:
pstmt.setBytes(4,aimString.getBytes());
取数据时:
new String(resultSet.getBytes("fieldName"),"ISO-8859-1");
分享到:
相关推荐
在Oracle数据库中,`VARCHAR2`是最常用的字符数据类型之一,用于存储变长的字符串。然而,在定义`VARCHAR2`类型时,可以选择指定长度为`BYTE`或`CHAR`。这两种方式看似细微的差别,实际上却对数据存储、性能优化以及...
在Oracle数据库中,默认情况下,`VARCHAR2`类型字段的最大长度为4000个字符。当需要处理更长的字符串时(例如,超过4000个字符),可以采用多种方法来解决这一问题。本文将详细介绍如何在.NET环境中处理和传递长度...
- **定义**:`VARCHAR` 类型在 Oracle 中实际上等同于 `VARCHAR2` 类型,是一个可变长度的字符类型。 - **示例**:如果创建了一个 `VARCHAR2(20)` 类型的字段,并插入 "abc",那么只占用 3 个字符的空间(而不是 20...
在Oracle数据库中,`VARCHAR`与`VARCHAR2`是两种常见的用于存储可变长度字符串的数据类型。尽管它们在名称上相似,但在实际应用中却存在一定的差异。本文将详细介绍这两种数据类型的特性及其应用场景,帮助读者更好...
首先,char 是定长的字符串类型,例如 char(10) 表示这个字段的长度是 10 个字符,如果我们存储的数据少于 10 个字符,剩下的空间将被空格填充,而 varchar2 则不同,varchar2(10) 只是表示这个字段的最大长度是 10 ...
VARCHAR2 是 Oracle 自己定义的一个非工业标准 VARCHAR,不同在于,VARCHAR2 用 NULL 代替 VARCHAR 的空字符串。 三、NVARCHAR 类型 NVARCHAR 类型是可变长度的 Unicode 字符类型,长度可以变化,例如 NVARCHAR(20...
`varchar2`是Oracle数据库独有的字符串类型,与`varchar`类似,也是可变长度的。然而,`varchar2`在Oracle中有一些额外的限制和优化。例如,`varchar2`的最大长度通常小于`varchar`,并且Oracle对`varchar2`的数据...
本文将深入探讨Oracle中的中文字符集问题,包括其基本概念、常见字符集类型以及如何在不同场景下正确配置和使用字符集。 #### 一、Oracle字符集概述 在Oracle环境中,字符集用于定义如何表示和存储字符数据。一个...
在Oracle数据库中,varchar2类型的字段长度可高达4,000个字符,但在特定情况下,如使用BLOB存储,可以扩展到更大的值。当从Oracle迁移到MySQL或GP时,可能需要调整字段长度以适应目标数据库的限制。例如,如果源...
### Oracle 数据类型及存储方式详解 ...通过以上示例可以看出,`CHAR`类型适合存储长度固定的字符串,而`VARCHAR2`类型则更适合存储长度不定的字符串。在实际应用中,应根据具体需求选择合适的数据类型。
本文将深入探讨Oracle的字符类型、数字类型、日期类型、ROWID类型和RAW类型的基本数据类型的存储机制。 首先,让我们聚焦于字符类型。在Oracle中,主要的字符类型包括CHAR、VARCHAR2和LONG。CHAR是定长字符类型,...
--2. 创建类型体 Create Or Replace Type Body Strcat_type Is Static Function ODCIAggregateInitialize( cs_ctx In Out strcat_type )Return Number is Begin cs_ctx := strcat_type( Null ); Return...
- **Oracle VARCHAR2**: 用于存储变长字符串,最大长度为4000字节。 - **DB2/400 CHAR/VARCHAR**: 用于存储固定或变长的字符数据。 对于Oracle中的VARCHAR2类型,可以根据实际需求选择与DB2/400中的CHAR或VARCHAR...
1. **表中的VARCHAR2字段存储了多字节字符**:如果某个字段的数据类型为VARCHAR2,并且其长度限制不足以完全容纳某些多字节字符(例如汉字),则可能导致数据截断。当尝试查询这些被截断的多字节字符时,Oracle...
- `varchar`: 可变长度的字符串,等同于Oracle中的`VARCHAR2`类型。 - `nvarchar`: 可变长度的Unicode字符串,等同于Oracle中的`VARCHAR2`类型。 - `text`: 大文本数据类型,等同于Oracle中的`LONG`类型。 - `...
相反,`VARCHAR2`是变长字符串类型,它只占用实际存储的字符数加上一个额外的字节来表示字符串长度(对于Oracle 12c及以后版本,最多2000个字符,对于Oracle 11g及以前版本,最多4000个字符)。比如,一个`VARCHAR2...
在Oracle数据库中,存储过程是预编译的SQL语句集合,它们允许开发人员执行复杂的业务逻辑和数据处理。在创建或更新表、插入数据、更新数据或执行其他数据库操作时,我们有时需要确保输入的数据不包含任何非法或特殊...
2. 数据类型:Oracle支持多种数据类型,如VARCHAR2(可变长度字符串)、NUMBER(数值)、DATE(日期时间)、LONG(长文本)、BLOB(二进制大对象)等,用于存储不同类型的数据。 3. 表的创建:使用CREATE TABLE语句...