oracle生僻字處理


背景:
今天遇到一個漢字生僻字在數據庫中GBK字符集中無法正常編碼存儲。
分析:
具體描述:生僻字“𡚸”無法存儲在數據庫上。
收集數據及析:1. 這個“𡚸”能夠使用的常用的輸入嗎?----不能,用了五筆,微軟拼字,在windows 10簡體中文的平台下,打不出這個字。
2. 數據庫的本地字符集是zhs16gbk,國標字符集utf-8
3. 測試從網上找到“𡚸”字copy下來,並放在select '𡚸' from dual;執行,無法顯示,只顯示'??'
4. 在百度上找到這個字‘𡚸’描述他的unicode代碼是216b8,並將此uniocde 碼copy到word下,進行轉碼“alt+x”,發現能轉碼成功,正常顯示出‘𡚸’
5. 使用該unicode編碼放在select unistr('\216b8') from dual; 解碼不正確,
6. 使用百度找了一個unicode轉碼的工具轉出來是\ud845\udeb8,然后再試一次,這里推斷u是轉碼標識符,在oracle中並不真正需要,改寫如下:select unistr('\d845\deb8') from dual;正確顯示。
7. 再進行一次祼數據轉換測試,成功顯示生僻字。
select utl_raw.cast_to_raw(unistr('\d845\deb8')) from dual;
select utl_raw.cast_to_nvarchar2('EDA185EDBAB8') from dual;
8. 再進行一次探索測試,使用將raw轉為varchar2,無法顯示:
select utl_raw.cast_to_varchar2('EDA185EDBAB8') from dual;
初步結論:該字符是能在nvarchar2下存儲,在varchar2下不能存儲。
第二輪分析:
具體描述:為什么同一個祼數據轉換為字符時,nvarchar2能顯示,varchar2不能顯示?
收集數據:nvarchar2->utf8 varchar2-> zhs16gbsk
分析:推斷這個生僻字使用utf-8應該能存儲。
試驗:select n'𡚸' from dual; <<<<<<<<<<<這里的N是指將這個字面義轉換為national character set ,對應我的環境就是UTF-8了。
執行上面的語句測試,成功顯示生僻字‘𡚸’
再進一步測試:
drop table hqq.qqt0528;
create table hqq.qqt0528 as
select n'𡚸' name from dual;
select * from hqq.qqt0528;
測試成功, '𡚸'成功存入數據庫,使用desc hqq.qqt0528; 發現name是nvarchar2格式,與文檔描述一致。
結論:
如果遇到生僻字,輸入法無法輸出,但在網上找到這個字及對應的unicode碼后,就可以把這個字copy下來,或使用word的alt+x生成生僻字,再使用insert into t1 values(n'生僻字'); 方式存入nvarchar2類型中,則可正常存儲到數據庫中, 並正常顯示。
參考文檔:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM