Oracle - 全角和半角
全角和半角
只有字符,数字,标点符号有全角和半角的区别,中文没有
普通写一句英文(即不要输入法):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 - 全角和半角的更多相关文章
- Oracle全角和半角处理函数
1.TO_MULTI_BYTE语法: TO_MULTI_BYTE(String) 功能: 计算所有单字节字符都替换为等价的多字节字符的String.该函数只有当数据库字符集同时包含多字节和单字节的字符 ...
- Java全角、半角字符的关系以及转换
如果搞明白了Java中全角字符和半角字符之间的关系,那他们之间的转换就不是个麻烦事儿.你只需要对这个关系有那么一个印象就足够了. 全角字符与半角字符的关系 通过下面的代码能看到Java中所有字符以及对 ...
- C#全角和半角转换
在计算机屏幕上,一个汉字要占两个英文字符的位置,人们把一个英文字符所占的位置称为"半角",相对地把一个汉字所占的位置称为"全角".在汉字输入时,系统提供&quo ...
- 用perl对字符串进行全角转半角操作
#全角转半角 #ljl use Encode; sub CheckSBC { my ($name)=@_; my @character; my $tmpname=$name; my $headname ...
- java 全角、半角字符串转换
转自:http://www.cnblogs.com/modou/articles/2679815.html 加入了空字符串的验证 半角转全角的方法: /** * @Title: ToSBC * ...
- 全角和半角相互转换(C语言实现)
目前,我们接触的汉字编码主要包括GBK和GB2312.其中,GB2312又称国标码,它是一个简化字的编码规范,也包括其他的符号.字母.日文假名等,共7445个图形字符,其中汉字占6763个.我们平时说 ...
- MySQL 全角转换为半角
序言: 用户注冊时候,录入了全角手机号码,所以导致短信系统依据手机字段发送短信失败.如今问题来了,怎样把全角手机号码变成半角手机号码? 1.手机号码全角转换成半角先查询出来全角半角都存在 ...
- word中利用宏替换标点标点全角与半角
Alt+F11,然后插入-模块: 复制下面代码到编辑窗口: Sub 半角标点符号转换为全角标点符号() '中英互译文档中将中文段落中的英文标点符号替换为中文标点符号 Dim i As Paragrap ...
- 刨根究底字符编码之五——简体汉字编码方案(GB2312、GBK、GB18030、GB13000)以及全角、半角、CJK
简体汉字编码方案(GB2312.GBK.GB18030.GB13000)以及全角.半角.CJK 一.概述 1. 英文字母再加一些其他标点字符之类的也不会超过256个,用一个字节来表示一个字符就足够 ...
随机推荐
- postman变量的使用和设置
之前只是使用postman做接口管理——将各个项目使用到的接口分类管理起来,用的时候手动改参数调用.这次项目连着跑三个接口,需要用到前一个接口的参数,还来回切平台,真的很麻烦,所以就搜了一下有什么便利 ...
- E - tower HYSBZ - 4657 (网络流割点)
题目链接:https://cn.vjudge.net/contest/281959#problem/E 题目大意:中文题目 具体思路:首先,有矛盾的时候就是两个导弹的运动轨迹会相交的时候,那么我们可以 ...
- C++11模板友元语法
第 1 类: 普通类A的 普通类B 友元(一对一友好关系): 无需前置声明class B,当class B第一次出现在friend声明中时,该名字被隐式地认为可见. class A { friend ...
- XMLHttpRequest: 网络错误 0x2f78,…00002f78
常在河边走,怎能不湿脚,在web前端开发的过程中总是遇到很多关于IE的故事. 一个get请求,传了一个json对象,包含一串参数,在IE上就出现了这个问题:XMLHttpRequest: 网络错误 0 ...
- 【转】Shell编程进阶篇(完结)
[转]Shell编程进阶篇(完结) 1.1 for循环语句 在计算机科学中,for循环(英语:for loop)是一种编程语言的迭代陈述,能够让程式码反复的执行. 它跟其他的循环,如while循环,最 ...
- 《Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks》
<Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks> 论文主要的三个贡 ...
- emmc基础技术8:操作模式3-interrupt mode
1. 前言 eMMC总线操作包含: boot mode, device identification mode interrupt mode data transfer mode 本文主要描述inte ...
- java中集合的组成及特点
1:集合 Collection(单列集合) List(有序,可重复) ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector 底层数据结构是数组,查询快,增删慢 线程 ...
- BZOJ 3498: PA2009 Cakes 一类经典的三元环计数问题
首先引入一个最常见的经典三元环问题. #include <bits/stdc++.h> using namespace std; const int maxn = 100005; vect ...
- 《剑指offer》-统计整数二进制表示中1的个数
题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...