背景:


项目使用oracle数据,在开发环境测试一些正常。项目部署到客户的服务器上后,系统在添加数据的时候报错。输出错误信息,发现是“超出最大长度”的异常。
但是按照数据库的设计,添加的数据应该在允许的数据长度范围内。那么是什么原因导致的呢,因是客户自己按照的oracle数据库,怀疑是部署环境的oracle参数设置和开发环境的不同。
 
过程:
查询oracle的相关参数:select * from nls_database_parameters;开发数据库和部署数据的查询结果如下:
开发数据库:
 
部署数据库:
 
经比较,发现开发库和部署库的 nls_characterset参数的值是不同的。
那么一个汉字和一个英文字母在开发库和部署库中各自占几个字节呢? 我们可以用sql语句查询一下。
select lengthb('金') from dual;

select lengthb('a') from dual;

 
开发库 部署库
经查询一个汉字在开发库中占2个字节,而在部署库中占三个字节。
 
我们可以进一步看一下“金”这个汉字在开发库中和部署库中到底存储成了什么。
使用语句:  select dump('金',1016) from dual;
开发库 部署库
可以看到汉字“金”在开发库中存储为  bd f0 占用2个字节,而在部署库中存储为 e9 87  91 占用3个字节。
 
结论:那么根据以上的信息,我们可以得出结论 当nls_characterset=zhs16gbk 时,一个汉字在oracle中占用2个字节,当nls_characterset=al32utf8时,
一个汉字在oracle中占用3个字节。
 
解决问题:
现在原因基本上已经找到了,那么如何解决。这也就到了我今天想要表达的主题“规避风险”。
网上一搜,发现遇到此问题的同学还是比较多的,下面给出了修改nls_characterset和nls_length_semantics参数的方法,都可以使问题得到解决。
但是修改参数可能带来的后果是非常严重的,风险系数比较高。是采用修改参数的方法是另辟蹊径。我选择了后者。
 
那么是否可以将数据库中的varchar2类型的字段长度扩充进而规避该问题,虽然该方法也有一定的弊端,可以在项目扩充上会有遗留问题,但是在目前来看不失为一个低风险的好方法。
生成扩充脚本的sql语句如下 : 
select 'alter table '||table_name||' modify '||column_name||' VARCHAR2('||data_length*2||');' 
 from cols 
 where data_type = 'VARCHAR2' 

and table_name in (select table_name from tabs where status = 'VALID')

 
生成数据脚本如下:
 
 
参数资料:

客户Oracle数据库在插入数据的时候报超出最大长度的错误(规避风险)的更多相关文章

  1. 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据

    向Oracle数据库中插入数据出错: 经过排查,因为Update数据时没有出错,所以OracleHelper没有问题: 看异常信息提示:无效的变量和数据,应该是SQL语句的问题,调试时所传的实例Use ...

  2. 解决getJdbcTemplate往oracle数据库中插入数据返回主键出错问题

    我们使用Spring中的JdbcDaoSupport往Mysql中插入数据并返回主键代码,我们使用的mysql数据库,主键在数据库中设置为自增长:该类继承自JdbcDaoSupport,所以能直接使用 ...

  3. Mybatis在oracle数据库中插入数据后返回自增值ID

    1.将id设置成自增序列 CREATE OR REPLACE TRIGGER "DATALIB"."TRIG_USER_ADD" BEFORE INSERT O ...

  4. 数据库中插入数据时发生ora-00984错误

    操作Oracle数据库,插入数据时显示:ORA-00984列在此处不允许错误,如下图所示: 出现的原因是由于,在插入字符或字符串型字段时.如果插入的数据是纯数字,则不会有错误:如果出现字符,则会报OR ...

  5. Oracle数据库中插入日期型数据(to_date的用法)(转载)

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  6. SQL语句往Oracle数据库中插入日期型数据(to_date的用法)

    Oracle 在操作数据库上相比于其他的 T-sql 有微小的差别,但是在插入时间类型的数据是必须要注意他的 to_date 方法,具体的情况如下: --SQL语句往Oracle数据库中插入日期型数据 ...

  7. Oracle数据库间的数据复制 - SQLPlus中的COPY命令

    Copy命令可以实现不同Oracle数据库间的数据的复制,也是可以实现同一数据库的数据复制,其性能表现和导入/导出相同. 根据9i文档,说Copy命令未来会不支持,但实际上Oracle 11g仍然支持 ...

  8. Oracle数据库四种数据完整性约束

     Oracle数据库四种数据完整性约束 1.实体完整性 同样的数据不能重复插入(1)采取什么措施保证实体完整性?我们可以给表创建主键约束吗,主键保证了数据的唯一性,主键可以保证同一条记录只能插入一次. ...

  9. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

随机推荐

  1. MS SQL到Oracle的数据迁移笔记

    MS SQL到Oracle的数据迁移笔记 一.任务背景 旧系统使用MS SQL Server数据库,新系统使用Oracle数据库,现在需要将旧系统中的数据迁移到新系统中,旧数据按照约定的规则转换后,能 ...

  2. .NET定时发送邮件

    添加一个全局应用程序类Global.asax 代码会在访问网站时运行 Global.asax代码: void Application_Start(object sender, EventArgs e) ...

  3. poj3282

    定义一个有4x+1组成的无限集合x>0&x∈Z 素数   x 不能有x = y*z,y,z都是素数 合数 x 有x = y*z y|z中某个数是素数 simi数,只能由两个素数构成. 打 ...

  4. php 之 分页查询的使用方法及其类的封装

    一.分页的使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  5. 3月6日 c#语言

    语言基础 一.输入与输出 1.Main函数: static void Main(string [] args) { }程序代码需要写在Main函数的花括号内. 2.输出: Console.Write( ...

  6. PS 色彩的色相谱

    7- 色彩的色相谱 在这个环中,位于180度夹角的两种颜色(也就是圆的某条直径两端的颜色),称为反转色,又称为互补色.互补的两种颜色之间是此消彼长的关系,小框往蓝色移动的同时就会远离黄色, 黄色=白色 ...

  7. ECSTORE1.2 重启开启信任登陆模块(删除KEY)

    1).若启用Mongodb 需要删除KEY分别为 1 2 3 be90a668d9f2eb1950bae1bf6b0835ce 939e64939c3f65cfb646e7948c5b80df 58d ...

  8. MySQL跨表更新字段 工作记录

    工作中遇到两表查询,从user表中获取用户唯一id字段 写入到另外一张qiuzu表中的uid字段中; 二者可以关联起来的只有用户的手机号码tel字段; 了解需求后数据量稍多,不可能一个一个的手动修改 ...

  9. sqlserver查询分析器创建sql查询日志

    USE [master]GO /****** Object: Audit [ServerAuditDB] Script Date: 2016-04-28 16:02:58 ******/CREATE ...

  10. Touch事件

    http://www.cnblogs.com/shawn-xie/archive/2012/12/07/2805582.html 前言 一个触屏网站到底和传统的pc端网站有什么区别呢,交互方式的改变首 ...