ORA-01847: day of month must be between 1 and last day of month 解决方法

本文探讨了Java SQL批量更新时遇到ORA-01847异常的原因及解决方案,涉及日期格式错误的两种常见情况:日期本身非法(如2月30日)和数据类型不一致(字符串与日期类型)。通过示例代码演示如何避免此类错误。


 Caused by: java.sql.BatchUpdateException: ORA-01847: day of month must be between 1 and last day of month 

该问题可能有2种情况:

1、日期本身是数据非法的,如2月30日,select to_date('2015-02-30','yyyy-mm-dd') from dual; 

2、数据类型不一致。比如代码中的数据类型是String,而数据库中对应的是Date类型,插入数据库时,同样也会报该异常。

### 解决Oracle数据库修改字符集时出现的ORA-12712错误 在修改Oracle数据库字符集时,如果执行`ALTER DATABASE CHARACTER SET`命令时出现错误`ORA-12712: new character set must be a superset of old character set`,表示新字符集必须是原字符集的超集。这种情况下,Oracle不允许将数据库字符集更改为不满足超集-子集关系的字符集。为了解决此问题,可以使用`INTERNAL_USE`参数强制修改字符集,绕过超集检查[^1]。 #### 使用`INTERNAL_USE`参数强制修改字符集 Oracle提供了一个未在官方文档中明确说明的参数`INTERNAL_USE`,用于强制完成字符集转换。通过该参数,可以跳过Oracle对字符集超集-子集关系的验证,从而实现字符集的更改。具体操作步骤如下: 1. 以`SYSDBA`身份登录数据库并启动数据库到`MOUNT`状态; 2. 启用受限会话模式; 3. 停止调度任务和队列进程; 4. 打开数据库; 5. 使用`INTERNAL_USE`参数执行字符集修改命令; 6. 关闭并重新启动数据库以确保更改生效。 示例SQL命令如下: ```sql SQL> startup mount SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; SQL> alter database open; SQL> ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK; SQL> shutdown immediate; SQL> startup ``` 上述操作会跳过字符集之间的超集检查,强制将数据库字符集更改为`ZHS16GBK`。需要注意的是,尽管此方法可以绕过Oracle的字符集验证机制,但在实际生产环境中应谨慎使用,以避免因字符集不兼容导致的数据损坏或乱码问题[^1]。 #### 注意事项 在使用`INTERNAL_USE`参数修改字符集时,需确保以下几点: - **数据一致性**:修改字符集后,需验证数据库中已有的数据是否在新字符集中能够正确显示,特别是包含中文或其他多字节字符的数据; - **客户端NLS_LANG设置**:客户端的`NLS_LANG`环境变量应与新的数据库字符集保持一致,以避免数据传输过程中的编码转换错误; - **数据库元数据转换**:Oracle在修改字符集时不会自动转换数据库元数据的字符集,因此需要手动检查和调整数据库对象的字符集设置[^2]。 此外,如果数据库中存在大量非ASCII字符数据,建议在修改字符集前进行数据导出备份,必要时可采用数据导出(`expdp`)和导入(`impdp`)的方式重新创建数据库,以确保数据在不同字符集之间正确转换[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值