居然插进去了

oracle字符集NLS_CHARACTERSET为ZHS16GBK,类文件编码为UTF-8,java运行时文件编码也为UTF-8(java -Dfile.encoding=UTF-8 Test),java中字符串getByte字节数大于4000,仍然可以插入oracle数据库varchar2(4000)字段。

System.out.println(System.getProperty("file.encoding"));

//=UTF-8

System.out.println("好".getBytes().length);

//=3字节,参考jdk源码Charset.defaultCharset()使用默认字符集file.encoding

System.out.println("好".getBytes("UTF-8").length);

//=3字节,确认使用默认字符集

System.out.println("好".getBytes("GBK").length);

//=2字节,在GBK字符集中只使用两个字节

StringBuilder sb = new StringBuilder();//2000个“好”字

for (int i = 0; i < 2000; i++) {

sb.append("好");// UTF8格式3个字节

}

System.out.println(sb.toString().getBytes().length);

//=6000字节(2000个字,每个字3字节)

//sb.append("a");

加一个字节将抛出异常 java.sql.SQLException: ORA-01704: 字符串文字太长

stmt.executeUpdate("insert into t_clob(col2)values(‘" + sb.toString() + "‘)");

没有异常,可正常插入,数据库只允许4000字节,为什么6000字节居然能插进去?

猜测:jdbc底层判断当前会话连接使用的字符编码(select userenv(‘language‘) from dual),进行转换后再通过网络传输给oracle服务处理。

System.out.println(sb.toString().getBytes("GBK").length);

//=4000字节

System.out.println(new String(sb.toString().getBytes(), "GBK"));    //乱码

System.out.println(new String(sb.toString().getBytes("GBK")));      //乱码

System.out.println(new String(sb.toString().getBytes("GBK"), "GBK"));   //正常

时间: 2024-10-29 00:37:45

居然插进去了的相关文章

如何插上U盘 自动复制内容

U盘插入自动复制,有效对付那些不肯给PPT的老师,还有一定几率拿到期末考试卷子···有图有真相!业界良心的好东西!!现在看还来得及!!! 代码优化了一下,把不是很重要的都删掉了,这次使用时看不出任何现象,同样复制U盘里的东西的时候不会出现进度条,完全后台运行. 同样的建立一个文本文档,WIN+R 里面打NOTEPAD ,或者自己新建一个都一样 把下面的代码复制进去 set fso=createobject("scripting.filesystemobject") set ws=cre

解决minigui在nvr上不支持鼠标热拔插

好几个月之前遇到的问题,nvr上鼠标拔下来再插进去就失效了.调试了下发现,鼠标拔出后,在nvr上,out集并不置位,但设备文件没了. 因此在每次收到鼠标事件都判断下设备文件是否存在,如果不存在就关掉套接字,让minigui在wait_event中尝试重连. 把minigui源码中src/ial/native/native.c的331~339行,替换为if (kbddev == &kbddev_event && FD_ISSET (fd, out)){    // FD_CLR (f

Oracle Function:当页面端有屏蔽相关字段数据函数,只有指定用户才能查看;而当前用户无法获取到相关数据插到其他表中,这时需要获取后台用户替换当前用户,执行完相关语句后再还原为当前用户。

1.该函数的作用:入库单提交/审核通过时,将相关数据插到/更新'出入库历史记录表':delivery_entering_record 由于页面端屏蔽了单价,指定的用户才能看到,故 与单价有关的数据插不进"出入库历史记录表"delivery_entering_record中,所以要用后台的用户替换当前用户,执行完相关语句后,在还原为当前用户(如代码:178~184和第208行所示):否则,插进去的数据全为0. 1 create or replace function delivery_e

Smart210学习记录------块设备

转自:http://bbs.chinaunix.net/thread-2017377-1-1.html 本章的目的用尽可能最简单的方法写出一个能用的块设备驱动.所谓的能用,是指我们可以对这个驱动生成的块设备进行mkfs,mount和读写文件.为了尽可能简单,这个驱动的规模不是1000行,也不是500行,而是100行以内. 这里插一句,我们不打算在这里介绍如何写模块,理由是介绍的文章已经满天飞舞了.如果你能看得懂.并且成功地编译.运行了这段代码,我们认为你已经达到了本教程的入学资格,当然,如果你不

【BZOJ】1012 最大数

[解析1]线段树 [分析] 这道题数据M<=200000,最直观的就是开棵线段树 O(M log M) 就过了. 没想到随手写的居然一次AC了,以后要杜绝这种坏习惯. [代码] #include <cstdio> #include <cstring> #include <cstdlib> #include <climits> using namespace std; const int M=200001; const int L=INT_MAX; co

HDU 5536 Chip Factory(字典树)

题目戳这 题意:给你n个数,从中选出三个数a,b,c,然后(a+b)^c,这个式子的值是最大的. 思路:如果来三个for循环,果断TLE,所以想到了字典树,就是先把所有的数字都插进去,在查询的时候就先把确定了的那两个数字删掉,然后在字典树中求出异或的最大值,得到结果后,再把两个数字插回去. P.S.一开始我的数组开到了45*10^5+10,然后他给我TLE,然后当我把数组开到10^5+10的时候,A了···········,居然是数组爆我时间了,我勒个擦. #include<stdio.h>

node.js中实现用户注册的功能

终于决定要实现注册的功能了,打开虚拟机发现,mongodb不能启动,我真是无语到了极点,谷歌了好久,原来是因为老是直接关闭虚拟机造成的,没办法,删除.lock文件 重启就可以了,别人还要  --repair一下,我直接略过,粗学者,就懂那么多啊,不过我也涨记性了,以后shutdown -h now一下. 设计一个简单的表结果,因为mongodb也比较特殊,我仍旧是一个粗学者,每次插入的时候,它会自动创建表,我们只需要常见一个db就可以了哦.然后下面这是表结构: /* user table*/ u

智能小车26:我做了个垃圾电路板

第一次做pcb,惨痛的教训,基本不能用.先看下打出的样板: 焊接后的正面: 焊接后的背面: 检测.改造了两天,才勉强工作.也就是上面两图中的最后一张,前面的两张都成了牺牲品.总结下问题: 1.孔太小,所有的孔都小.最严重的是7805芯片,引脚是粗的,根本插不进去.最后改造了下,借助一个3p排母把7805装上去了. 2.arduino的两组数字排母之间的间距太大,要把一级引脚斜一下才能插进去. 3.最大的错误:一组排母与线连接错位了,插上arduino,线路完全就错了,短路! 4.l293d芯片的

Linux下PHP加速器APC的安装与配置

我已经感知到他属于那">我已经感知到他属于那 个时代的">个时代的 受难者">受难者 许我和">许我和 他是社会">他是社会 同类">同类 许他随口哼唱出来">许他随口哼唱出来 歌--那">歌--那 些名歌">些名歌 情歌">情歌 民歌--我太熟悉">民歌--我太熟悉 太久违了">太久违了 我为自己庆幸"&