全角和半角

只有字符,数字,标点符号有全角和半角的区别,中文没有

普通写一句英文(即不要输入法):I am 28 years old, do you love me?
采用半角写:I am 28 years old, do you love me?
采用全角写:I am 28 years old,do you love me?

可以看到数字,字符,标点符号都变了样子

而输入一段中文
采用半角写:我爱你,祖国。
采用全角写:我爱你,祖国。

可以看到,对于中文来讲,不管是汉字还是标点符号,都是全角的形式。

oracle数据库中有两个函数

to_single_byte(), 将全角转为半角
to_multi_byte(), 将半角转为全角

实验一:

create table test1(id number, name varchar2(20));

insert into test1 values(1,'中国你好,我爱你');
insert into test1 values(2,'中国你好,我爱你');
insert into test1 values(3,'中国你好,我爱你');
insert into test1 values(4,'中国你好');
insert into test1 values(5,'中国你好123@$');

commit;

select id,name,dump(name,1016),dump(to_single_byte(name),1016) from test1;

1 中国你好,我爱你 Typ=1 Len=16 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,a3,ac,ce,d2,b0,ae,c4,e3 Typ=1 Len=15 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,2c,ce,d2,b0,ae,c4,e3 中国你好,我爱你
2 中国你好,我爱你 Typ=1 Len=16 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,a3,ac,ce,d2,b0,ae,c4,e3 Typ=1 Len=15 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,2c,ce,d2,b0,ae,c4,e3 中国你好,我爱你
3 中国你好,我爱你   Typ=1 Len=15 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,2c,ce,d2,b0,ae,c4,e3 Typ=1 Len=15 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,2c,ce,d2,b0,ae,c4,e3 中国你好,我爱你
4 中国你好               Typ=1 Len=8 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3 Typ=1 Len=8 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3 中国你好
5 中国你好123@$ Typ=1 Len=18 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,a3,b1,a3,b2,a3,b3,a3,c0,a1,e7 Typ=1 Len=14 CharacterSet=ZHS16GBK: d6,d0,b9,fa,c4,e3,ba,c3,31,32,33,40,a1,e7 中国你好123@$

用varchar2存的字符串,全角可以转为半角,半角也可以转为全角(这里我就不贴出来了)

实验二:

create table test(id number, name nvarchar2(20));

insert into test values(1,'中国你好,我爱你');
insert into test values(2,'中国你好,我爱你');
insert into test values(3,'中国你好,我爱你');
insert into test values(4,'中国你好');
insert into test values(5,'中国你好123@$');

select id,name,dump(name,1016),dump(to_single_byte(name),1016),to_single_byte(name) from test;

ID NAME DUMP(NAME,1016) DUMP(TO_SINGLE_BYTE(NAME),1016 TO_SINGLE_BYTE(NAME)
1 中国你好,我爱你 Typ=1 Len=16 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,c,62,11,72,31,4f,60 Typ=1 Len=17 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,c,62,11,72,31,4f,60, 中国你好,我爱你
2 中国你好,我爱你 Typ=1 Len=16 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,c,62,11,72,31,4f,60 Typ=1 Len=17 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,c,62,11,72,31,4f,60, 中国你好,我爱你
3 中国你好,我爱你 Typ=1 Len=16 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,0,2c,62,11,72,31,4f,60 Typ=1 Len=17 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,0,2c,62,11,72,31,4f,60, 中国你好,我爱你
4 中国你好 Typ=1 Len=8 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d Typ=1 Len=9 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d, 中国你好
5 中国你好123@$ Typ=1 Len=18 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,11,ff,12,ff,13,ff,20,ff,4 Typ=1 Len=19 CharacterSet=AL16UTF16: 4e,2d,56,fd,4f,60,59,7d,ff,11,ff,12,ff,13,ff,20,ff,4, 中国你好123@$

可以看到使用了to_single_byte函数好像没什么改变,显示出来的东西都是一样,但是在末尾添了个0

用select * from test where to_single_byte(name)='中国你好,我爱你',却查不到任何结果。这里特别需要小心,使用了to_single_byte函数,显示出来的结果,跟它实际的编码是不一样的。

这里需要使用select * from test where to_single_byte(to_char(name))='中国你好,我爱你',to_char这里将name字段的nvarchar转化为varchar

总结:

建议大家在使用字符串时,不管中文英文最好使用varchar2,nvarchar的确有很多坑。(备注:我的实验是在11.2.0.4做出来的,有朋友说12c不存在后面添加0的现象,可能是11g的一个小bug)

后记:

有时候如果应用报错ORA-29275: partial multibyte character,可以根据这个思路来

最新文章

  1. 本地mysql打不开的解决方法
  2. [python]爬虫学习(一)
  3. android 返回键 操作
  4. HNOI2002
  5. HTTP幂等性
  6. 为你的PHP程序选择合适的密码库(初稿)
  7. ftp nfs samba比较
  8. Hadoop文件的基本操作
  9. cocos2d-x3.x 设计与实现弹出对话框
  10. 脱壳第三讲,UPX压缩壳,以及补充壳知识
  11. Dreamweaver CS5 CS6 代码格式化、美化插件(可同一时候格式化HTML、JavaScript、CSS )眼下最好用的代码格式化扩展
  12. MyAdapter Andriod
  13. 使用Huginn抓取Discourse论坛
  14. cucumber学习笔记
  15. javascript嵌套java实现jsp
  16. PDF怎么添加文字水印与图片水印
  17. poj 3278 搜索
  18. CCF CSP 201312-2 ISBN号码
  19. 使用嵌入式jetty实现文件服务器
  20. Redis分布式锁服务(转)

热门文章

  1. Mysql 插入中文错误:Incorrect string value: '\xE7\xA8\x8B\xE5\xBA\x8F...' for column 'course' at row 1
  2. Redis实现聊天功能
  3. c# 创建项目时提示:未能正确加载“microsoft.data.entity.design.bootstrappackage
  4. java多线程系列六、线程池
  5. 使用ajax上传表单(带文件)
  6. linux unzip 中文乱码解决方法
  7. Oracle基本命令大全
  8. ocp linux 基础要点
  9. LeetCode(64):最小路径和
  10. LeetCode(35):搜索插入位置