解决数据库中文乱码问题(Oracle)
1:当数据库的字符集为西文字符那么用中文作为条件的时候会查不出内容7,可以在中定义一个转码函数,用于字符集转码,如下:
CREATE OR REPLACE Function GB2UNICODE(sInput in varchar2)
Return NVARCHAR2
IS
--nstr varchar2(512);
sTest varchar2(2000);
nCount integer;
nIdx integer;
i integer;
Begin
sTest:=rawtohex(utl_raw.cast_to_raw(convert(sInput,'AL16UTF16','ZHS16GBK')));
nCount:=length(sTest)/4;
for i in 1..nCount loop
nIdx:=4*(nCount-i);
sTest:=substr(sTest,1,nIdx)||'\'||substr(sTest,nIdx+1);
--DBMS_OUTPUT.put_line(sTest);
end loop;
return unistr(sTest);
--return convert(sInput,'AL16UTF16','ZHS16GBK');
--nstr:=utl_raw.CAST_TO_VARCHAR2(convert(sInput,'AL16UTF16','ZHS16GBK'));
--DBMS_OUTPUT.put_line(nstr);
--return '';
End;
然后用中文条件去查询的时候就加上去,使用示例:
select gb2unicode('你好') from dual;
2:还有一个种情况,我们通过程序去查询数据库的时候,用中文条件去查询,可能会查不出内容,但是如果我们把语句放入可视化工具如:plsql、Navicat 就可以查出内容,这个时候有可能就是传输中文时乱码了,通常情况下可以使用转码的方式解决,如:
new String(“你好”.getBytes("GBK"), "ISO_8859_1");
除了这个还有一个解决方案就是可以把中文转为16进制,传输的时候就是用16进制进行传输,然后sql语句中使用函数在把16进制转回来,废话不多说往下看:
public class DataUtils {
private final static Logger logger = LoggerFactory.getLogger(DPlanblockController.class);
/*
* 字节数组转16进制字符串
*/
public static String bytesToHexString(byte[] bArr) {
if (bArr == null) {
return null;
}
StringBuffer sb = new StringBuffer(bArr.length);
String sTmp;
for (int i = 0; i < bArr.length; i++) {
sTmp = Integer.toHexString(0xFF & bArr[i]);
if (sTmp.length() < 2)