第一篇自己写的东西,内容有点简单,还是记下来和大家分享下。因为觉得重要的可能不是内容,而是一种变通的思维。
今天有一个需求,要在oracle中检索出某个字段是否含有汉字,根据是否含有汉字进行约束。第一个想法是正则表达式(对这部分不是很熟),但是百度了很久也没看到(现在还不
知道是否有这样的正则表达式,欢迎高人赐教)。
后来想到汉字的特殊性,即一个汉字占两个字节,后来根据lengthb()函数进行区分,如果length(某字段)<>lengthb(某字段)说明该字段中含有汉字。
原理如下 select length('21幢301室') from dual; 其结果为7;
select lengthb('21幢301室') from dual; 其结果为9;
即lengthb()函数返回字符串的字节数,根据这个就可以判断了,如果对同一个字段分别取length()与lengthb(),如果相等即不含汉字。
只是换了一种解决问题的方法从正则表达式换到其他函数,问题似乎就很简单的解决了,只是转了个弯,收获很大。
写到这里,欢迎高手指教!
2013-8-19补充:今天看书时谈到了oracle的字符集,其中有单字节字符集和多字节字符集之分,两种字符集的区别是存储字符时是按照一个字节存储一个字符,还是多个字节存储一个字符。所以,以上描述的就有问题,可能并不是在所有情况下length与lengthb都是不同的,但针对具体的汉字,一般选用的字符集是多字节字符集,因此这种方法可行,但之前的理解却狭隘了。真是学的东西越多越发现自己欠缺的东西越多。