Oracle數據庫 union連接時報 字符集不匹配 異常

比如這段SQL:

select r1.USERCODE, r1.ROLEID, r1.APQPID, '' SUPPLIERCODE
from SQM_APQP_MEMBER_ROLE r1
where r1.APQPID = 4393
union
select r1.USERCODE, r1.ROLEID, r1.APQPID, s.SUPPLIERCODE
from SQM_APQP_SUPPLIER_MEMBER r1
left join SQM_APQP_SUPPLIER s on s.USERCODE = r1.USERCODE
where r1.APQPID = 4393

我在測試庫完全能執行,發佈生產後就不能執行,報字符集不匹配的異常,當時嚇尿了。Union前後兩個子查詢都能單獨執行,一旦連接就報錯。
首先測試和生產的數據庫字符集都是UTF8,不是這個問題,然後比較字段類型時發現不同:s.SUPPLIERCODE 在測試的類型是varchar2,而生產是nvarchar2
然後就找到了問題,字段類型不一致時不能進行union連接,我用’’做了一個默認值,數據庫默認爲varchar2,所以生產報錯。。。這裏涉及一個點,varchar2可以兼容升級成nvarchar2,但不能向下兼容,所以當時就只能重新添加新字段(varchar2),把值複製過去,刪除舊字段,重命名新字段。
從代碼上解決的話,把空字符可以直接用null定義,但就不能發現問題所在。我覺得更好的解決的話,直接測試和生產腳本同步一下。另外,還有兩個函數可以用:cast('xxx' as nvarchar2(50))to_char(s.SUPPLIERCODE),可以使字段類型保持一致。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章