为纪念中华人民共和国建军90周年,特此一篇,以此纪念,我军威武!!!

一、问题背景

项目中商品发布,却没有保存成功。

二、问题定位

初步判断向数据库中保存时出现了错误,查看日志文件,由于日志文件过大就采用grep进行搜索(再一次说明grep 的强大)



其中 “ReserveProductService.update” 是要搜索的关键字,catalina.out是日志文件, -n 显示搜索内容所在行数, -B 2 是显示搜索内容的前两行(还有-C 前后几行,-A 后几行)

将2换成更大值显示内容如下

问题原因就出来了,由于插入内容长度超过了字段长度限制

注:为了方便分析错误日志,将日志内容修改如下,修改后会打印到对应的日志文件中,而不是全部输入到tomcat控制台中

修改前
public static void dbLogError(StringBuffer errorMessage, Exception ex) {
		if (dbLog != null) {
			dbLog.error(errorMessage);
		}

		if (isPrintStackTrace && ex != null) {
			ex.printStackTrace();
		}
	}

修改后

public static void dbLogError(StringBuffer errorMessage, Exception ex) {
		if (dbLog != null) {
			dbLog.error(errorMessage);
		}

		if (isPrintStackTrace && ex != null) {
			dbLog.error(ex.getMessage(), ex);       //将错误栈打印到日志文件中
			ex.printStackTrace();
		}
	}

三、问题分析

查看该字段在数据库中的设置

qualitystan              VARCHAR2(254) default '',

其就是254


而前台限制的是200字

if(trim(document.getElementsByName('bean.qualityStan')[0].value).length > 200){
        		alert("您输入的质量标准超过了200字,请重新输入!");
          		document.getElementsByName('bean.qualityStan')[0].focus();
          		return;
        	}

为什么错误栈中却提示的是实际值是314。看下Oracle中varchar2长度的说明


oracle 中的dataType可参考
http://docs.oracle.com/cd/E11882_01/server.112/e41084/sql_elements001.htm#SQLRF30020


查看项目中用的编码格式
SELECT parameter, VALUE FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET ZHS16GBK


说明:
字节。

VARCHAR2(N),其中的N可能是指字符数,也可能是指字节数。你可以显式地在声明的时候指定,比如VARCHAR2(10 BYTE)或者VARCHAR2(10 CHAR),未显式指明时,则由参数NLS_LENGTH_SEMANTICS决定。

SQL> SELECT parameter, VALUE FROM nls_database_parameters;
PARAMETER                      VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CURRENCY                   $
NLS_ISO_CURRENCY               AMERICA
NLS_NUMERIC_CHARACTERS         .,
NLS_CHARACTERSET               ZHS16GBK
NLS_CALENDAR                   GREGORIAN
NLS_DATE_FORMAT                DD-MON-RR
NLS_DATE_LANGUAGE              AMERICAN
NLS_SORT                       BINARY
NLS_TIME_FORMAT                HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY              $
NLS_COMP                       BINARY
NLS_LENGTH_SEMANTICS           BYTE
NLS_NCHAR_CONV_EXCP            FALSE
NLS_RDBMS_VERSION              11.2.0.4.0



那么字段QUALITYSTAN(varchar2(254))的编码格式是ZHS16GBK,长度限制的是254个字节。汉字的话会占用2个字节,因此如果是200个汉字的话,其实是400个字节,而字段长度确实254个字节。因此这个时候还是超出了。


四、问题解决

1)可以修改数据库字段长度,或者类型(用varchar2(254char)或者nvarchar2(254))
2)修改前端限制,这个比较方便简单
if(trim(document.getElementsByName('bean.qualityStan')[0].value).length > 120){
        		alert("您输入的质量标准超过了120字,请重新输入!");
          		document.getElementsByName('bean.qualityStan')[0].focus();
          		return;
        	}

总结:看似简单的问题,其实更需要扎实的基础。

最新文章

  1. 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览
  2. 二刷Cracking the Coding Interview(CC150第五版)
  3. 纯 CSS 绘制图形(心形、六边形等)
  4. Excel导入导出组件的设计
  5. STL学习笔记
  6. c++ 基于wincrypt的DES CBC模式加解密
  7. Ubuntu mongodb 安装和配置
  8. UMLUnified Modeling Language (UML)又称统一建模语言或标准建模语言
  9. A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏
  10. 函数mem_pool_create
  11. 利用dbms_backup_restore恢复数据库
  12. C#基础总结之Attribute
  13. zabbix利用orabbix监控oracle
  14. proc文件系统探索 之 根目录下的文件[二]
  15. Vue评论组件案例
  16. BASE64编码的图片在网页中的显示问题的解决
  17. python之路——20
  18. python 从大到小排序
  19. Python实现代理模式
  20. Linux 防火墙:Netfilter iptables

热门文章

  1. UOJ #79. 一般图最大匹配
  2. Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树
  3. Jmeter 抓app包 抓到一半不好用了
  4. [设计模式][C++]单例模式
  5. 610D - Vika and Segments(线段树+扫描线+离散化)
  6. angular编译机制
  7. "is not allowed to connect" mysql
  8. 实训10a--用数据值填充下拉列表
  9. Android之MVP模式实现登录和网络数据加载
  10. OC 内存管理之自动内存管理ARC