合 Oracle中如何判断一个字符串是否含有汉字
前言部分
导读
各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,\~O(∩_∩)O\~:
①全角字符的判断,或者是含有汉字的字符串的判断
实验环境介绍
11.2.0.3 RHEL6.5
本文简介
看到网友问,怎么查询表中某个字段数据是不是包含了全角字符啊? 这个问题涉及到几个函数:to_single_byte、length和lengthb,我之前做开发的时候研究的是如何判断一个字符串中是否包含中文,其实和这个本质是一样的,且看实验部分。
实验部分
lengthb和length函数结合to_single_byte函数
---含有汉字,严格的说是含有全角字符
1 2 3 4 5 6 | SELECT l.name, length(l.name), lengthb(l.name) FROM xb_link l WHERE length(l.name) != lengthb(l.name) AND length(l.name) < 20; |
以下数据也满足条件:
1 2 3 4 5 6 7 8 9 10 11 | SELECT l.id, l.name FROM xb_link l WHERE length(l.name) != lengthb(l.name) AND l.metacategory IN ('com.gxlu.ngrm.network.DDNCircuit', 'com.gxlu.ngrm.network.FRCircuit', 'com.gxlu.ngrm.network.ATMCircuit', 'com.gxlu.ngrm.network.DDNOCircuit', 'com.gxlu.ngrm.network.FROCircuit') AND l.id IN ('301898331', '301898335', '301908187', '301929403'); |
所以可以借助to_single_byte函数来解决。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SELECT l.id, l.name, to_single_byte(l.name), length(l.name) l1, lengthb(l.name) l2, length(to_single_byte(l.name)) l FROM xb_link l WHERE length(l.name) != lengthb(l.name) AND l.metacategory IN ('com.gxlu.ngrm.network.DDNCircuit', 'com.gxlu.ngrm.network.FRCircuit', 'com.gxlu.ngrm.network.ATMCircuit', 'com.gxlu.ngrm.network.DDNOCircuit', 'com.gxlu.ngrm.network.FROCircuit') AND l.id IN ('301898331', '301898335', '301908187', '301929403'); |