问题描述:
varchar2(2) abc;
intert into table_name(abc) values('好');
报错:插入字符过长!经过测试,发现一个汉字占3个字节。
问题所在:
使用的字符集是UTF8,就有可能出现这个错误!
使用命令查看:
SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
PARAMETER
--------------------------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CHARACTERSET
AL32UTF8
解决方法:建议使用ZHS16GBK字符集!
操作:
cmd命令行下,执行
①sqlplus /nolog
②conn
user/pwd@orcl as sysdba 注:最好使用sys用户登录
③SQL> SHUTDOWN IMMEDIATE; //立即停止数据库
④conn
user/pwd@orcl as sysdba //连接到一个空闲例程
注:如此处提示“TNS:监听程序无法识别链接描述符中请求的服务”,则进入oracle dbhome_1\netwrok\admin\目录
打开listener文件,如下
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = G:\oracle\product\11.2.0\db_1)
(PROGRAM = extproc)
)
//粗体为新增内容
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = G:\oracle\product\11.2.0\db_1)
(SID_NAME = ORCL)
)
)
重启oracle的listener服务。
⑤ 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 INTERNAL_USE ZHS16GBK; //此句容易出错,“新字符集必须为旧字符集的超集”
⑩ SQL> SHUTDOWN IMMEDIATE;
end :SQL> STARTUP;
下面再用 SQL> select * from v$nls_parameters where parameter='NLS_CHARACTERSET';
看一下吧。
看一下吧。