ORA-02374: conversion error loading table "MPJ"."SM_MMS_MTDB"
ORA-12899: value too large for column SUBJECT (actual: 59, maximum: 50)
ORA-02372: data for row: SUBJECT : 0X'B6CCD0C5CDA8B5C0D2ECB3A3A3ACBBFDD1B931303030A3ACD7'
出现这个错误, 是因为原来的数据库是GBK的,每个汉字两个字节,但新数据库是UTF-8的,每个汉字是三个字节,导致超过长度报错。所以要看下数据库的字符集看看是否一致,不一致需要调整。
步骤 1:确认当前字符集
首先查询数据库当前的字符集:
sql
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET';
如果返回 AL32UTF8
,则表示当前使用的是 UTF-8 字符集。
步骤 2:检查数据兼容性
确保所有现有数据都可以无损转换为 GBK。使用以下命令检查:
sql
ALTER SESSION SET NLS_LANGUAGE = 'AMERICAN';
ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
-- 检查非 GBK 字符
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET';
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_NCHAR_CHARACTERSET';
-- 运行字符集扫描工具(需 DBA 权限)
$ sqlplus / AS SYSDBA
SQL> @?/rdbms/admin/utl32k.sql
如果发现无法转换的字符,需先处理这些数据(如删除或替换)。
步骤 3:关闭数据库
确保没有用户连接,并关闭数据库:
sql
SHUTDOWN IMMEDIATE;
步骤 4:以限制模式启动数据库
sql
STARTUP RESTRICT;
步骤 5:更改字符集
使用 ALTER DATABASE CHARACTER SET INTERNAL_USE
命令(注意:INTERNAL_USE
绕过字符集验证,但可能导致数据丢失):
sql
ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;
如果遇到错误(如 ORA-12712),说明存在无法转换的字符,需返回步骤 2 进一步处理。
步骤 6:重启数据库
sql
SHUTDOWN IMMEDIATE;
STARTUP;
步骤 7:验证更改
再次查询字符集确认更改成功:
sql
SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET';