Oracle varchar2 Chinese characters

本文介绍如何在Oracle数据库的VARCHAR2类型字段中插入中文字符。首先检查数据库字符集是否支持中文,然后设置NLS_LANG环境变量,并演示了两种插入中文的方法。


This doc describe how to insert a Chinese character into Oracle varchar2 datatype column


1. Check character set is correct in database

$ sqlplus scott/tiger@orcl

SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 22 19:31:42 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select * from V$NLS_PARAMETERS where PARAMETER in ('NLS_LANGUAGE', 'NLS_TERRITORY', 'NLS_CHARACTERSET');

PARAMETER
----------------------------------------------------------------
VALUE                                                                CON_ID
---------------------------------------------------------------- ----------
NLS_LANGUAGE
AMERICAN                                                                  0

NLS_TERRITORY
AMERICA                                                                   0

NLS_CHARACTERSET
AL32UTF8                                                                  0

SQL> quit
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

2. Set NLS_LANG value, which is in the format [NLS_LANGUAGE]_[NLS_TERRITORY].[NLS_CHARACTERSET].
$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8


3. Insert data

$ sqlplus scott/tiger@orcl
SQL> CREATE TABLE TESTTAB(A DECIMAL(2, 0), C VARCHAR2(20));
Table created.

SQL> INSERT INTO(A, C) TESTTAB VALUES(1, '你好');
1 row created.

SQL> SELECT * FROM TESTTAB;

         A C
---------- --------------------
         1 你好


SQL> SELECT RAWTOHEX(C) FROM TESTTAB;

RAWTOHEX(C)
----------------------------------------
E4BDA0E5A5BD


SQL> INSERT INTO TESTTAB(A, C) VALUES(2, UTL_RAW.CAST_TO_VARCHAR2 (HEXTORAW('E4BDA0E5A5BD')));
1 row created.

SQL> SELECT * FROM TESTTAB;

SQL> SELECT * FROM TESTTAB;

         A C
---------- --------------------
         1 你好
         2 你好


<think> 我们正在讨论Oraclevarchar2数据类型的最大长度问题。根据提供的引用,我们可以总结如下: 1. 在表字段定义中,varchar2的最大长度允许为4000字节(无论是varchar2(4000 byte)还是varchar2(4000 char))[^1][^3][^4]。 2. 但是,当使用char作为单位时(如varchar2(4000 char)),表示最多可以存储4000个字符,但实际存储的字节数不能超过4000字节(在数据库块大小为标准8k时)[^4]。 3. 在PL/SQL中,变量声明为varchar2类型时,最大长度可以达到32767字节[^3]。 4. 对于函数参数,varchar2类型也可以达到32767字节;但函数返回值类型varchar2的最大长度仍然是4000字节[^3]。 另外,关于存储汉字: - 在默认情况下(使用字节单位),每个汉字占用2个或3个字节(取决于数据库字符集,如ZHS16GBK为2字节,UTF-8为3字节)[^4]。 - 因此,如果使用varchar2(10 byte),最多可以存储5个汉字(在ZHS16GBK字符集下)或3个汉字(在UTF-8字符集下,因为3*3=9<10,3个汉字占9字节,而4个汉字则12字节>10)。 - 如果使用varchar2(10 char),则可以存储10个汉字,但总字节数不能超过4000。所以,即使指定为4000 char,实际插入的汉字也不能超过1333个(在UTF-8字符集下,因为4000/3≈1333.33)[^4]。 因此,总结Oraclevarchar2的最大长度: - 作为表列:最大4000字节。 - 作为PL/SQL变量:最大32767字节。 注意:Oracle 12c及以上版本引入了扩展数据类型(通过MAX_STRING_SIZE参数控制),允许将varchar2的最大长度扩展到32767字节。但需要特别配置,且一旦扩展不可逆。 现在,根据用户需求,他想要查询Oraclevarchar2数据类型的最大长度,我们可以这样回答: </think> ### Oracle VARCHAR2 数据类型最大长度详解 在 Oracle 数据库中,`VARCHAR2` 的最大长度限制取决于使用场景和定义方式,以下是详细总结: #### 1. **表字段定义(列存储)** - **最大字节数**:4000 字节(硬性限制) - **定义方式**: - `VARCHAR2(n BYTE)`:按字节计算,支持最多 4000 字节 - `VARCHAR2(n CHAR)`:按字符计算,但实际存储字节数仍不能超过 4000 字节[^3][^4] - **汉字存储示例**: - UTF-8 字符集:单个汉字占 3 字节 - `VARCHAR2(1333 CHAR)`:可存 1333 个汉字(1333×3≈4000 字节) - 尝试存储 1334 个汉字(4012 字节)会报错 `ORA-01461`[^4] #### 2. **PL/SQL 编程环境** | 场景 | 最大长度 | 说明 | |---------------------|----------|--------------------------| | 变量声明 | 32,767 字节 | 如 `DECLARE str VARCHAR2(32767)`[^3] | | 函数参数 | 32,767 字节 | 参数传递不受 4000 字节限制[^3] | | 函数返回值 | 4000 字节 | 返回给 SQL 时仍受表字段限制[^3] | #### 3. **特殊场景与注意事项 - **扩展数据类型(Oracle 12c+)**: 通过修改参数可实现更大存储: ```sql ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED; ``` 启用后最大支持 32,767 字节(需重启数据库)[^1] - **字节 vs 字符差异**: ```sql -- 按字节定义(默认) CREATE TABLE t1 (col VARCHAR2(10 BYTE)); -- 最多存 10 字节数据 -- 按字符定义 CREATE TABLE t2 (col VARCHAR2(10 CHAR)); -- 最多存 10 个字符 ``` 存储汉字时: - `t1` 在 UTF-8 下最多存 3 个汉字(3×3=9 字节) - `t2` 可存 10 个汉字(但总字节不能超 4000)[^2][^4] #### 4. **常见错误解决方案 | 错误代码 | 原因 | 解决方案 | |---------------|------------------------------|----------------------------| | ORA-00910 | 定义长度 >4000 字节 | 减小字段长度或启用扩展模式 | | ORA-12899 | 插入数据超过定义长度 | 检查字符集和单位(BYTE/CHAR)| | ORA-01461 | 插入数据超过 4000 字节 | 拆分数据或使用 CLOB 类型 | > **最佳实践**:对超过 4000 字节的数据使用 `CLOB` 类型,对多语言系统优先使用 `CHAR` 单位定义。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值