Oralce 中汉字长度问题

一般,我们在Java层验证字符串长度的时候,使用String.length()方法,无论中文还是英文,返回的长度都是一样的。

但是,在插入数据库后,有时候会报错(长度越界)。

public class StringLength {

	public static void main(String[] args) {
		System.out.println("测试".length());
		System.out.println("cs".length());
	}

}

控制台显示结果为:

2
2

但是在数据库中,根据数据库字符集的不同,汉字所占的“位数”也不相同:

数据库字符集 所占位数
WE8ISO8859P1 1
AL32UTF8 3
ZHS16GBK 2

所以,当我们设定一个字段username最长为3时,数据库中必须这样定义

WE8ISO8859P1 情况下    varchar(3)
AL32UTF8 情况下             varchar(9)
ZHS16GBK 情况下            varchar(6)

这就要求我们在定义表的时候考虑到应用情况。

那么如何查看当前数据库的字符集呢?

select * from nls_database_parameters;

当然,还需要注意,查看数据库中字符长度和字节长度的问题,因为varchar类型定义的长度为字节长度。

varchar(3) 等价于 varchar(3 byte)

所以,执行下边代码会出现:

select length('测试') from dual;  --2
select lengthb('测试') from dual; --4
select length('cs') from dual;    --2
select lengthb('cs') from dual;   --2
时间: 2024-10-09 23:51:23

Oralce 中汉字长度问题的相关文章

JAVA 中汉字在不同编码下的字节不同

*/ utf-8中文字节长度:6 utf-16中文字节长度:6 UTF-16BE中文字节长度:4 UTF-16LE中文字节长度:4 UTF-32中文字节长度:8 UTF-32BE中文字节长度:8 UTF-32LE中文字节长度:8 unicode中文字节长度:6 GBK中文字节长度:4 GB2312中文字节长度:4 GB18030中文字节长度:4 ISO8859-1中文字节长度:2 BIG5中文字节长度:3 ASCII中文字节长度:2 -------------------------------

本程序找出字符串数组 String[] arr = {“welcome”, “china”, “hi”, “congratulation”, “great”} 中的长度最大的元素,并打印输出。

/** * Homework14 * * @Description:本程序找出字符串数组 String[] arr = {"welcome", "china", "hi", * "congratulation", "great"} 中的长度最大的元素,并打印输出. * StringDemo01 * * @author  * * email: [email protected] 2017年4月18日下午6:3

转换字符串中汉字为其拼音缩写(C#)

第一种方法 转换字符串中汉字为其拼音缩写(C#) //将指定字符串中的汉字转换为拼音缩写,其中非汉字保留为原字符.    public string GetPinYin(string text)   {    char pinyin;    byte[] array;    System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length); foreach(char c in text)    {     piny

iOS URL中汉字的编码和解码

发现NSString类中有内置的方法可以实现.他们分别是: - (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 只要传入相应的编码即可以进行编码和解码了,不过此方法是对整个Url进行编码的所以如果有Query Str

CSS中的长度问题-------Day76

今天没有继续昨天的问题,因为今天没时间,从来就感觉自己在忙,不过可喜的是,以前我在忙着迷茫,现在我在忙着励志...记得有句话说的特别好"那些想明白了就可以不做的事情,往往不做就想不明白",这句话让我佩服很久,那些曾经的日子总在提醒我要珍惜现在. 说说css的几种距离吧,大致有px.em.pt.pc.in.mm.cm.ex八种,其中最常见到的是px,我还见到过的有ex和mm.cm,当然后两个在当年见的更多. 其实px,我们最熟悉,而在电脑上也应用最多,因为显示器的分辨率就是...px*.

Myeclipse中导入项目后java类中汉字注释出现乱码问题(已解决)

今天重装系统,安装了新的Myeclipse后,导入之前的项目后,,出现了乱码问题.乱码问题主要是java类中的注释,而jsp页面中汉字却完好如初: 右键项目,查看项目的编码格式,UTF-8,把java文件直接用记事本打开,没问题,没有乱码,查看了一下记事本的编码格式,GBK,看来myeclipse无法解析汉字的原因是因为对于java文件的编码格式不是GBK,网络上查了一下,发现在myeclipse中 编写java文件的默认编码格式是GBK,于是将java的默认编码格式改为GBK,就可以了.具体步

150131-编写程序,打印其输入文件中单词长度直方图

编写程序,打印其输入文件中单词长度直方图(横.竖).       1. 横直方图     1 #include<stdio.h> 2 main() 3 { 4 char c; 5 int i=0; 6 7 while((c=getchar())!=EOF) { 8 9 if(c>='a'&&c<='z'||c>='A'&&c<='Z') 10 { 11 printf("%c",c); 12 i++; 13 } 14 1

table 中 文字长度大于td宽度,导致文字换行 解决方案

1.TD不换行 nowrap属性 表格table的td单元格中,文字长了往往会撑开单元格,但是如果table都不够宽了,就换行了好像(不要较真其他情况,我只说会换行的情况).换行后的表格显得乱糟糟,不太好看,我不喜欢这样的换行.当然可以通过对每列td都设置宽度,那样太麻烦了,并且有时没法预计td中的文字会有多长,没法给固定宽度. 为了让表格里文字不换行(预计也不会太长的字符串),可以给表格里td添加一个nowrap属性,如 <td nowrap>文字内容</td> 这样. 但是如果

MYSQL 表中汉字写入或字段赋值时乱码情况排误

-- 当修改字段值,或是直接写入时,汉字变成乱码情况 ,[可注意一下数据库名,记得修改] -- 当字符顺序对汉字不兼容时,可能直接导致乱码情况发生. 最好做到库.表.字段(字符类型)排序规则是否一致 -- eg.在某库下建了临时表没有指定字符排序规则,下游会使用时,将临时表中的str字段值赋值给另外一个库表,可能会出现乱码 -- 未指定排序建表时,则表的排序规则是其库的排序规则 -- 1. 库级别 SELECT * -- DEFAULT_CHARACTER_SET_NAME DEFAULT_CO