Oracle中varchar2类型字段长度限制使用问题
2024-10-09 10:58:03
为纪念中华人民共和国建军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; }
总结:看似简单的问题,其实更需要扎实的基础。
最新文章
- 在禅道中实现WORD等OFFICE文档转换为PDF进行在线浏览
- 二刷Cracking the Coding Interview(CC150第五版)
- 纯 CSS 绘制图形(心形、六边形等)
- Excel导入导出组件的设计
- STL学习笔记
- c++ 基于wincrypt的DES CBC模式加解密
- Ubuntu mongodb 安装和配置
- UMLUnified Modeling Language (UML)又称统一建模语言或标准建模语言
- A Plug for UNIX 分类: POJ 图论 函数 2015-08-10 14:18 2人阅读 评论(0) 收藏
- 函数mem_pool_create
- 利用dbms_backup_restore恢复数据库
- C#基础总结之Attribute
- zabbix利用orabbix监控oracle
- proc文件系统探索 之 根目录下的文件[二]
- Vue评论组件案例
- BASE64编码的图片在网页中的显示问题的解决
- python之路——20
- python 从大到小排序
- Python实现代理模式
- Linux 防火墙:Netfilter iptables
热门文章
- UOJ #79. 一般图最大匹配
- Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树
- Jmeter 抓app包 抓到一半不好用了
- [设计模式][C++]单例模式
- 610D - Vika and Segments(线段树+扫描线+离散化)
- angular编译机制
- ";is not allowed to connect"; mysql
- 实训10a--用数据值填充下拉列表
- Android之MVP模式实现登录和网络数据加载
- OC 内存管理之自动内存管理ARC