全角和半角

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

普通写一句英文(即不要输入法):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,可以根据这个思路来

Oracle - 全角和半角的更多相关文章

  1. Oracle全角和半角处理函数

    1.TO_MULTI_BYTE语法: TO_MULTI_BYTE(String) 功能: 计算所有单字节字符都替换为等价的多字节字符的String.该函数只有当数据库字符集同时包含多字节和单字节的字符 ...

  2. Java全角、半角字符的关系以及转换

    如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...

  3. C#全角和半角转换

    在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角".在汉字输入时,系统提供&quo ...

  4. 用perl对字符串进行全角转半角操作

    #全角转半角 #ljl use Encode; sub CheckSBC { my ($name)=@_; my @character; my $tmpname=$name; my $headname ...

  5. java 全角、半角字符串转换

    转自:http://www.cnblogs.com/modou/articles/2679815.html     加入了空字符串的验证 半角转全角的方法: /** * @Title: ToSBC * ...

  6. 全角和半角相互转换(C语言实现)

    目前,我们接触的汉字编码主要包括GBK和GB2312.其中,GB2312又称国标码,它是一个简化字的编码规范,也包括其他的符号.字母.日文假名等,共7445个图形字符,其中汉字占6763个.我们平时说 ...

  7. MySQL 全角转换为半角

    ​序言:       用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...

  8. word中利用宏替换标点标点全角与半角

    Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragrap ...

  9. 刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK

    简体汉字编码方案(GB2312.GBK.GB18030.GB13000)以及全角.半角.CJK   一.概述 1. 英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够 ...

随机推荐

  1. POST 上传 JSON 数据

    // // ViewController.m // 03-post上传json // // Created by jerry on 15/10/10. // Copyright (c) 2015年 j ...

  2. android greenDao使用

    github:https://github.com/greenrobot/greenDAO 基本使用:https://toutiao.io/posts/yg1kyu/preview https://b ...

  3. RNN(2) ------ “《A Critical Review of Recurrent Neural Networks for Sequence Learning》RNN综述性论文讲解”(转载)

    原文链接:http://blog.csdn.net/xizero00/article/details/51225065 一.论文所解决的问题 现有的关于RNN这一类网络的综述太少了,并且论文之间的符号 ...

  4. Kernel 3.0.8 内存管理函数【转】

    转自:http://blog.csdn.net/myarrow/article/details/7208777 1. 内存分配函数 相关代码如下: #define alloc_pages(gfp_ma ...

  5. KVM -> 虚拟机在线热添加技术_04

    热添加技术 1.KVM在线热添加硬盘

  6. nagios系列(三)之nagios被动监控模式之添加系统负载load、swap、磁盘iostat及memory内存监控详解

    环境: nagios server:192.168.8.42 host_name:node4.chinasoft.com nagios client:192.168.8.41 host_name:no ...

  7. centos 6.5环境利用iscsi搭建SAN网络存储服务及服务端target和客户端initiator配置详解

    一.简介 iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的.可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够 ...

  8. rsa加密解密, 非对称加密

    2016年3月17日 17:21:08 星期四 现在越来越懒了.... 参考: http://www.xuebuyuan.com/1399981.html 左边是加密流程, 右边是解密流程 呃...有 ...

  9. ANN算法总结

    kd-tree kd-tree works poorly in high dimensions (k<30) 自己实验的时候差不多20到30左右吧,超过之后,就真的很慢了 faiss suppo ...

  10. JUnit单元测试--IntelliJ IDEA

    单元测试的基本使用 一.环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件. 1.安装JUnit插件步骤 File-->settings-->Plguins--&g ...