ORACLE判別字段是否包含中文 | 您所在的位置:網(wǎng)站首頁 › 屬狗的和屬蛇的合不合婚 › ORACLE判別字段是否包含中文 |
??? 在ORACLE數(shù)據(jù)庫中如何查找那些字段里面包含中文的數(shù)據(jù)記錄呢,有時候就是有這樣的特殊需求,下面整理了一些判別字段中包含中文記錄的幾個方法 ? 1:使用ASCIISTR函數(shù)判別 ? ASCIISTR函數(shù)說明: ASCIISTR返回字符的ASCII形式的字符串。非ASCII的字符被轉(zhuǎn)化為\xxxx的形式。 使用ASCIISTR函數(shù)也是根據(jù)非ASCII字符會被轉(zhuǎn)化這個特性來判別中文字符,只要里面包含中文字符,則必定會有\(zhòng)xxx這樣的字符。且簡體漢字的編碼范圍是B0A1 - F7FE.如下例子所示 CREATE?TABLE TEST(??? NAME_ONE?? CHAR(24)?? ,NAME_TWO?? VARCHAR2(24)?? ,NAME_THR?? NCHAR(24)?? ,NAME_FOR?? NVARCHAR2(24))?INSERT INTO TESTSELECT?'abc10', 'abc20', 'abc30', 'abc40'???????? FROM DUAL UNION?ALLSELECT?'abc11', 'abc21', 'abc31', 'abc41'???????? FROM DUAL UNION?ALLSELECT?'abc12', 'abc22', 'abc32', 'abc42'???????? FROM DUAL UNION?ALLSELECT?'abc1!', 'abc2!', 'abc3!', 'abc4!'???????? FROM DUAL UNION?ALLSELECT?'abc1#', 'abc2#', 'abc3#', 'abc4#'???????? FROM DUAL UNION?ALLSELECT?'abc1$', 'abc2$', 'abc3$', 'abc4$'???????? FROM DUAL UNION?ALLSELECT?'ab測試1', 'ab測試2', 'ab測試3', 'ab測試4'?FROM DUAL;使用 ASCIISTR(NAME_ONE) LIKE '%\%' 就能判別那些有中文的記錄。如下所示: SELECT NAME_ONE FROM TEST WHERE ASCIISTR(NAME_ONE) LIKE?'%\%'?但是如果字段里面的非ASCII字符不僅僅有中文,例如還有日文之類,那么這個方法就不能準(zhǔn)確判別了,如下所示,我插入一條包含日文的記錄. INSERT INTO TEST?SELECT?'abこんにちは1', 'abこんにちは2', 'abこんにちは3', 'abこんにちは4'?FROM DUAL;?COMMIT;??SQL> SELECT NAME_ONE FROM TEST WHERE ASCIISTR(NAME_ONE) LIKE?'%\%';?NAME_ONE------------------------ab測試1abこんにちは1? 2:使用CONVERT函數(shù)判別 CONVERT函數(shù)說明: CONVERT(inputstring,dest_charset,source_charset) ?? inputstring:要轉(zhuǎn)換的字符串 ???? dest_charset:目標(biāo)字符集 ???? source_charset:原字符集 SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE?PARAMETER='NLS_CHARACTERSET';?PARAMETER????????????????????? VALUE------------------------------ ----------------------------------------NLS_CHARACTERSET?????????????? UTF8?SQL> SELECT NAME_ONE, NAME_TWO FROM TEST WHERE? NAME_ONE CONVERT(NAME_ONE, 'ZHS16GBK', 'UTF8');?NAME_ONE???????????????? NAME_TWO??????????????? ------------------------ ------------------------ ab測試1????????????????? ab測試2??????????????? abこんにちは1??????????? abこんにちは2????
? 3:使用函數(shù)length和lengthb來判別 ?? ??? 使用函數(shù)length與lengthb來判別,是基于中文字符占用2~4個字節(jié),而ASCII字符占用一個字節(jié),那么對比LENGTH與LENGTHB就會不一樣。這樣就能判別字段中是否包含中文字符,但是跟ASCIISTR一樣,如果里面的非ASCI字符包含非中文,它一樣不能判別。依然有取巧嫌疑。
SELECT NAME_ONE FROM TEST WHERE LENGTH(NAME_ONE) != LENGTHB(NAME_ONE);
? 關(guān)于三者的性能,基本上都差不多,并沒有那個性能要快一點。當(dāng)然我沒有詳細(xì)、大量測試過,只是就某個案例的執(zhí)行計劃分析而已。 ? 參考資料: http://www.bitscn.com/pdb/oracle/201407/240540.html http://blog.csdn.net/yzsind/article/details/6106050 http://blog.itpub.net/9399028/viewspace-687789
|
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設(shè)備網(wǎng) 版權(quán)所有 |