最近做一個項目,里面很多特殊字符,引發了一些問題,解決后很開心,特別來分享。
特殊字符:
Jörg Ranau
Sigut? Jakštonyt?
Côte d'Ivoire
數據庫手工導入數據
- 先檢查數據庫的字符集和客戶端字符集是否一致。 采用的是UTF8 查看語句:
select * from nls_database_parameters
- 若是采用DOS 下的SQLPLUS 導入數據,需要
set NLS_LANG=AMERICAN_AMERICA.UTF8
windows: set NLS_LANG=AMERICAN_AMERICA.UTF8
unix: NLS_LANG=AMERICAN_AMERICA.UTF8
- 檢查導入的數據的文件格式,格式采用: UTF8 without BOM,
可以用NOTEPAD++, CONVER TO UTF8 without BOM
也可以用txt , 轉換成UTF8.
第3點非常重要,之前忽略了,發現插入導入數據庫后,數據顯示不對。 驗證你導入的數據是否正確可以用ORACLE DUMP 命令。
select dump(country_desc),country_desc from tb_test where testcode='1';
Typ=1 Len=14: 67,195,180,116,101,32,100,39,73,118,111,105,114,101 Côte d'Ivoie
數據庫腳本中遇到特殊字符:
- 單引號‘ , oracle 腳本需要寫成 兩個單引號
- 特殊字符&, oracle 表示需要的參數, 若是數據中有這個有2個方法:
第1 種:
set define off; 第2種:
set escape on;
然后將所有的&, 替換成/&。 - 空行
用<br> 代替。
JAVA 代碼導入數據:
要導入的數據都放在TXT 類型的文件里,通過batch job 導入數據庫。
檢查導入的數據的文件格式,格式采用: UTF8 without BOM, 可以用NOTEPAD++, CONVER TO UTF8 without BOM
java 代碼:
1: 讀文件
InputStreamReader read = new InputStreamReader (new FileInputStream(file),"UTF-8");
BufferedReader inBuf=new BufferedReader(read);

2: 檢查所用開發工具的文件ENCODING 字符。
這個就是會為什么導致沒發現:
讀文件錯誤,在開發工具中打出的LOG 欺騙了我們的眼睛。我的開發工具BEA 里JAVA 文件默認ENCODING cp1252, 改成UTF8 就好了。
這個特別容易忽略,當在控制臺看LOG的時候,發現讀過來的文件里的內容打出來都正確,就忽略了JAVA的源文件。認為是從unicode轉換 utf8 有問題,特別將字符又做了處理,發現插入數據庫還是不正確。
修改了ENCODING 字符字符后發現讀入文件就不對了。這樣輕松就解決了。
所以只要修改了讀文件的時候采用 UTF8格式就可以啦。