可以用腳本把CHAR型別欄位全部轉換成VARCHAR2型,同時截斷字串的空格,如下:
declare
begin
for c in (select *
from user_tab_columns t1
where t1.DATA_TYPE = 'CHAR'
) loop
execute immediate 'alter table ' || c.table_name || ' add g_w_' || c.column_name || ' varchar2(' || c.char_length || ')';
execute immediate 'update ' || c.table_name || ' set g_w_' || c.column_name || ' = ' || c.column_name;
execute immediate 'update ' || c.table_name || ' set ' || c.column_name || ' = null';
execute immediate 'alter table ' || c.table_name || ' modify ' || c.column_name || ' varchar2(' || c.char_length || ')';
execute immediate 'update ' || c.table_name || ' set ' || c.column_name || ' = trim(g_w_' || c.column_name || ')';
execute immediate 'alter table ' || c.table_name || ' drop column g_w_' || c.column_name;
end loop;
end;
1.首先是去除空格在進行比較(例如,把姓名中的所有空格去除):
Update table_name set xm=replace(xm , ' ') ;
如果要尋找哪些記錄含有' ',可用相關的語句來尋找。
然後可進行比較。
2.但是我們可能會發現,有些名字中間或末尾還有類似空格的字符沒被去掉,但它們顯然已經不是一般的空格了,那麼懷疑是Tab健作怪。於是參考網路上說的去掉TAB鍵的辦法來處理,用chr(9)來取代空白鍵(TAB鍵的ASCII值為9)。先取一條有類別空格字元的記錄來做實驗:
SELECT replace(xm, chr(9) ) from table_name where;
用這個辦法會去掉一些真正的Tab鍵空格,然後採取批次更新的辦法。
3.但我遇到的狀況沒有這麼幸運,沒能去掉類別空白鍵。怎麼辦呢?我決定嘗試先取得這個類別空格鍵的ASCII碼值,然後再用chr(ASCII碼值)的方法來處理。
①.取得含類空格鍵整個字串的長度 length(),從而確定出類別空格鍵在字串中的起始位置、類別空格鍵的長度。
②.出類別空白鍵的ASCII碼值:ascii(substr(xm,n,m)); n為類別空白鍵的起始位置;m為長度。
③.SELECT replace(xm, chr(第②步得的ASCII碼值) ) from table_name where;
問題得以解決。但我發現,上述第②步得的ASCII碼值為41377,這應該是一個漢字的ASCII碼值,看起來又像空格,於是我懷疑,會不會是中文狀態下的空格鍵、TAB鍵?嘗試之後發現不是。我又懷疑,是不是全角、半角的差別?因為我們一般輸入字符,是在半角下輸入的。我按照第一步「1.首先是去除空格在進行比較…」嘗試,輸入全角下的空格,進行查找,結果驚喜出現,原來所有未剔除掉的類空格,是全角狀態下輸入的空格,並接證實了全角下輸入的空格,其ASCII碼值為41377。
以上是解決Oracle中CHAR類型資料中空格問題的方法是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!