java.sql.SQLException: ORA-01461: can bfor insert into a LONG column
1.发现系统报此问题的第一反应是插入数据时,数据长度超出数据库的字段长度。
2.而根据错误日志不难分析出是向邮件发送信息表中插入数据时,数据超过定义的最大值限制了,但到底是哪个字段,需进一步看一下代码和日志。
3.根据错误日志的时间找到跟踪日志,找到组装邮件DTO的数据,一个一个排查,最终发现只可能是邮件内容超出长度了。
但邮件内容是有长度判断与处理的(即:判断是否超过数据库字段所设置的4000长度,如果超过了,进行截取处理)
String emailContent = null; if(mailContent != null){ emailContent= mailContent.buildMailContent(args); } if(emailContent!=null&&emailContent.length()>4000){ emailContent=emailContent.substring(0, 4000); } mailDTO.setEmailContent(emailContent);
进一步分析,发现邮件内容的组装有html标签及样式的定义;而查看跟踪日志,发现’<’被替换为’<’、’>’被替换为’>’,于是我就主观的认为是在保存至数据库时,'<'、'>'标签被转义处理(即’<’变成了’<’,仅此一个’<’的长度由1变成了4)。
后来,将跟踪日志中的邮件内容拷出,将其全部’<’替换为’<’、’>’替换为’>’,并将内容中的单引号再加一个单引号的转义处理,通过PL/SQL更新开发环境里的一条记录,报超出长度错误提示。经一步步减少字符长度,最终发现:“将内容去掉6个汉字或11个英文字母,都能正常更新成功”。按上面的在保存至数据库时,'<'、'>'标签被转义处理的原因推测,减少6个汉字或11个英文字母,应该还是会超出长度。
于是,我将邮件内容中的所有’<’替换为’<’、’>’替换为’>’ ,在UltraEdit-32中发现其长度是4011(正好符合上面更新SQL 减少11个英文字母能正常更新),此时,想到原来代码扫描时的getByte()方法,有字符编码格式的问题。
进一步,我将’<’替换为’<’、’>’替换为’>’的邮件内容字符串进行了如下测试:
//全部’<’替换为’<’,全部’>’替换为’>’ String res3 = "<html><style>th , td{font-size: 13px;color: #4f5b75;font-weight: bold;border: 1px solid #95a7bf;border-collapse: collapse;padding: 4px;height: 22px;}</style><body>尊敬的XXX:<br /> 您好!<br /> ... 此处内容省略 ... </body></html>"; System.out.println("res3:" + res3.length()); //结果是:3801 byte[] b_str = res3.getBytes(); System.out.println("b_str:" + b_str.length); //结果是:4011
分析到这里,我们应该知道原因了。
原因是:
str.length()返回此字符串的长度。长度等于字符串中 Unicode 代码单元的数量。即不论是中文还是英文,都是按照1个长度来看待的,而不是根据所占的字节数来计算length长度。
而我们的ORACLE数据库存储格式应该是UTF-8或GBK之类(肯定不是JAVA中的Unicode 代码单元的数量)。
//全部’<’替换为’<’,全部’>’替换为’>’ String res3 = "<html><style>th , td{font-size: 13px;color: #4f5b75;font-weight: bold;border: 1px solid #95a7bf;border-collapse: collapse;padding: 4px;height: 22px;}</style><body>尊敬的XXX:<br /> 您好!<br /> ... 此处内容省略 ... </body></html>"; System.out.println("res3:" + res3.length()); byte[] b_str = res3.getBytes(); System.out.println("b_str:" + b_str.length); try { byte[] b_str3 = res3.getBytes("GBK"); System.out.println("GBK b_str3:" + b_str3.length); //结果:4011 byte[] b_str2 = res3.getBytes("UTF-8"); System.out.println("UTF-8 b_str2:" + b_str2.length); //结果:4221 } catch (UnsupportedEncodingException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }
发现用GBK编码解析这串字符串长度正好是4011。据此反推:我们的数据库的编码格式是GBK。
简单来说,系统在组装邮件对象后对邮件内容长度进行判断(长度是3801)是满足小于4000的条件的,而到后台保存至数据库时,由于数据库是GBK编码的,按GBK编码,其长度为4011,超出数据库字段的定义长度4000。所以报“ORA-01461: can bfor insert into a LONG column”错误。
解决方法:
将原来的如下校验
if(mailContent != null){ emailContent= mailContent.buildMailContent(args); }
改为:
if(emailContent != null) { byte[] bytes = emailContent.getBytes("GBK"); if(bytes.length > 4000) { int tempLen = new String(bytes, 0, 4000, "GBK").length(); //根据tempLen长度截取原字符串 emailContent = emailContent.substring(0, tempLen); } }
相关推荐
微信小程序Artandw_eapp-artand
本项目是一款基于Vue和JavaScript开发的心旅途个性化推荐旅游平台设计源码,整合了513个Java文件、76个PNG图片、70个XML配置文件、62个JavaScript文件、42个Vue组件文件、28个CSS样式文件、22个HTML文件、18个YAML配置文件、16个属性文件、11个Vue模板文件,总计919个文件。平台采用现代化前端技术堆栈,旨在为用户提供个性化的旅游推荐服务。
微信小程序开发地图演示、地图导航、标记标注_echat-weapp-mpdemo
Vue和Axios文件
该项目为基于Python语言开发的HTML与任务清单关系系统,包含50个文件,其中16个为HTML文件,14个为Python源代码文件,其余包括Python编译文件、Markdown文件、图片、数据库文件、配置文件、模板文件、文本文件等,旨在为用户提供简单便捷的生活时间段安排及任务规划管理工具。
全国大学生电子设计大赛项目合集全国电赛优秀作品大学生电子竞赛历届题目
该项目是一款基于Python和pygame引擎开发的植物大战僵尸游戏,包含125个文件,涵盖93个PNG图像文件、11个Python源代码文件、10个Python字节码文件、8个GIF动画文件、1个Git忽略配置文件、1个JSON数据文件以及1个Markdown说明文件。游戏设计源码为学习游戏开发提供了丰富的实践素材。
本项目是一款以Java为核心开发的Qiniu服务端设计源码整合的RunFlow桌面端效率工具,总文件数29个,包括17个Java源文件、2个属性文件、1个Git忽略文件、1个JAR包文件、1个LICENSE文件、1个Markdown文件、1个YAML文件、1个Maven配置文件和1个命令文件。该工具旨在提升工作效率,适用于各种桌面环境下的便捷使用。
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
Golang支付-微信公众号、微信应用、微信小程序、微信企业支付、支付宝网络版、支付宝应用、支付宝企业支付_支付宝
医疗辅助诊断系统-开题
该项目为东东购物网的后台开发源码,采用JavaScript为主要编程语言,辅以CSS、Java、HTML等多种语言,共包含1300个文件。具体文件类型分布如下:458个PNG图片文件、215个JavaScript文件、160个JPG图片文件、159个GIF图片文件、107个CSS样式表文件、96个Java源代码文件、28个HTML文件、24个XML文件、12个JSON文件、8个Map文件。该系统旨在提供高效、便捷的购物后台管理功能。
content_1728052071778.apk
资源视频编辑软件win781064位系统
职业心理测试人格气质情绪控制测试18个文件
那些年,与你同分同位次的同学都去了哪里?全国各大学在辽宁2020-2024年各专业最低录取分数及录取位次数据,高考志愿必备参考数据
该项目为基于Python语言的微信小程序源码,全面整合了JavaScript和微信小程序开发技术。项目结构包含50个文件,涵盖了15个PNG图片、9个JSON配置、8个JavaScript脚本、7个wxss样式表、6个WXML模板和4个JPG图片。此外,还包括1个Markdown文档。该小程序的设计与实现展现了Python编程的强大能力,适用于微信生态下的各类应用场景。
全国大学生电子设计大赛项目合集全国电赛优秀作品电赛B题风力摆控制系统设计(原理图+源代码+设计报告等)
基于西门子S7-200PLC的自动灌溉系统组态王组态 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面
该项目是基于GitHub平台的xClouds-device项目设计源码,包含2835个文件,包括763个头文件、630个C语言源文件、207个文本文件、144个Makefile文件、102个Python脚本、86个Markdown文件、70个二进制文件、59个实验文件、50个Shell脚本、48个项目构建脚本。该项目主要使用C语言编写,辅以Python、Shell、C++和C++等语言,适合进行设备控制和云平台交互开发。