Navicat Premium查询Oracle数据库中文乱码或raw类型数据显示乱码
中文乱码现象
使用Navicat连接Oracle数据库,查询中文是乱码。
中文乱码解决
查询数据库字符集:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [oracle@lhrora11204 ~]$ sas SQL*Plus: Release 11.2.0.4.0 Production on Sun May 15 13:57:00 2022 Copyright (c) 1982, 2013, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SYS@LHR11G> select userenv('language') from dual; USERENV('LANGUAGE') -------------------------------------------------------------------------------------------------------- AMERICAN_AMERICA.AL32UTF8 |
设置连接,“右击”选择“编辑连接”,选择“高级”,设置客户端字符集与数据库字符集查询结果一致;
测试连接,连接成功后,点击“确定”,重新打开连接即可;
如果不能成功,那么可以设置环境变量,添加NLS_LANG变量,即可,可能需要重新打开Navicate premium。
1 2 3 4 | SELECT userenv('LANGUAGE') db_NLS_LANG FROM DUAL; export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK" export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" |
raw类型乱码
1 2 3 4 5 6 7 8 9 | SQL> desc v$session; Name Null? Type ----------------------------------------- -------- ---------------------------- SADDR RAW(8) SID NUMBER SERIAL# NUMBER AUDSID NUMBER PADDR RAW(8) 。。。。。。。。 |
raw是未处理的二进制数据 ,数据库查出来显示乱码很正常 ,那么 我们要工作要查看数据 ,怎么才能变成人能看懂的数据呢
如果oracle 如果用的是plsql ,plsql会自动把raw类型转换成16进制,所以不会出现乱码,如果是navcat的话 就得用oracle的函数
HEXTORAW() 函数: 将一个十六进制构成的字符串转换为二进制
RAWTOHEX() 函数:将一个二进制构成的字符串转换为十六进制
如果是mysql,用navcat的话 用mysql的函数
HEX()函数:返回十六进制值的字符串表示形式。注意:并不是十进制转化为十六进制数,而是转化为字符串
UNHEX() 函数: 每对十六进制数字转化为一个字符。