oracle insert汉字出错,oracle insert中文后,select是乱码
解决方法
1、insert之前先设定nls_lang环境变量为中文,然后再插入中文数据
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
or
export NLS_LANG="SIMPLIFIED
CHINESE_CHINA.ZHS32GB18030"
如果这样后,反而插不进去,或者仍然为乱码,表示当初再建库时,没有选择中文字符集
(export NLS_LANG=AMERICAN_AMERICA.AL32UTF8)
2、dbca一个新库,在字符集处选择中文
3、强行修改服务器端ORACLE当前字符集(此方法没有试过,但应该是要在安装db的时候已经安装了此字符集,属猜测)
在用imp命令加载数据前,先在客户端用sql*plus登录system
DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:SQL >; create
database character set US7ASCII
*createdatabasecharactersetUS7ASCII
ERRORatline 1:
ORA-01031: insufficientprivileges
你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数据装载完成以后,shutdown
数据库,再startup
数据库,用合法用户登录ORACLE数据库,在sql>;命令提示符下,运行select * from
V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。
4、利用数据格式转储,避开字符集限制
这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下:
先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase
格式或Access格式数据库,再用转换工具转入到不同字符集的ORACLE数据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象Power
Builder5.0以上版本提供的
oracle中的数据库乱码的原因与解决 “在SQL*Plus中用insert插进的都是中文的,为什么一存入服务器后,再select出的就是???”
“有的时候,服务器数据先导出,重装服务器,再导入数据,结果,发生数据查询成???”
……
这些问题,一般是因为字符集设置不对造成的。
很久以来,字符集一直是困扰着众多Oracle爱好者的问题,笔者从事Oracle数据库管理和应用已经几年了,经常接到客户的类似上面提到的有关数据库字符集的“告急”和“求救”,在此我们就这个问题做一些分析和探讨。
首先,我们要明确什么是字符集?字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包括关系,如us7ascii就是zhs16gbk的子集,从us7ascii到zhs16gbk不会有数据解释上的问题,不会有数据丢失,Oracle对这种问题也要求从子集到超集的导出受支持,反之不行。在所有的字符集中utf8应该是最大,因为它基于unicode,双字节保存字符(也因此在存储空间上占用更多)。
其次,一旦数据库创建后,数据库的字符集是不能改变的。因此,在设计和安装之初考虑使用哪一种字符集是十分重要的。数据库字符集应该是操作系统本地字符集的一个超集。存取数据库的客户使用的字符集将决定选择哪一个超集,即数据库字符集应该是所有客户字符集的超集。
Bbs.Svn8.Com
在实际应用中,和字符集问题关系最大的恐怕就是exp/imp了。在做exp/imp时,如果Client
和Server的nls_lang设置是一样的,一般就没有问题的。但是,要在两个不同字符集的系统之间导数据就经常会有这样或那样的问题,如,导出时数据库的显示正常,是中文,当导入到其他系统时,就成了乱码,这也是一类常见问题。
现在,介绍一些与字符集有关的NLS_LANG参数,
NLS_LANG格式:
NLS_LANG = language_territory.charset
有三个组成部分(语言、地域和字符集),每个成分控制了NLS子集的特性。其中:language 指定服务器消息的语言。
territory 指定服务器的日期和数字格式。
charset 指定字符集
例如:
AMERICAN_AMERICA.US7SCII
AMERICAN_AMERICA.ZHS16GBK
还有一些子集可以更明确定义NLS_LANG参数:
DICT.BASE 数据字典基本 表版本
DBTIMEZONE 数据库时区
NLS_LANGUAGE 语言 参考资料:www.svn8.com
NLS_TERRITORY 地域
NLS_CURRENCY 本地货币字符
NLS_ISO_CURRENCY ISO货币字符
NLS_NUMERIC_CHARACTERS 小数字符和组 分隔开
NLS_CHARACTERSET 字符集
NLS_CALENDAR 日历系统
NLS_DATE_FORMAT 缺省的日期格式
NLS_DATE_LANGUAGE 缺省的日期语言
NLS_SORT 字符排序序列
NLS_TIME_FORMAT 时间格式
NLS_TIMESTAMP_FORMAT 时间戳格式
……
通过props$动态性能视图,我们可以查看数据库的字符集信息:
$> sqlplus internal
SQL> desc props$
Name Type Nullable Default Comments
NAME VARCHAR2(30)
VALUE$ VARCHAR2(4000) Y
COMMENT$ VARCHAR2(4000) Y
SQL> set arraysize 1
SQL> col value$ format a40
SQL> select name,value$ from props$ where
name=‘NLS_CHARACTERSET’;
NAME VALUE$
NLS_CHARACTERSET ZHS16GBK
SQL> select * from sys.props$;
NAME VALUE$
DICT.BASE 2
DBTIMEZONE 0:00
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN Svn8.Com
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI. SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.
SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON- RR HH.MI. SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_NCHAR_CHARACTERSET ZHS16GBK
NLS_RDBMS_VERSION 8.1.6.0.0
NAME VALUE$
GLOBAL_DB_NAME SCPDB1
EXPORT_VIEWS_VERSION 8
22 rows selected
SQL>
从结果可以看出:
NLS_LANG = AMERICAN _ AMERICA. ZHS16GBK
虽然,数据库的字符集是在create
database的时候指定的,以后不允许改变,但在一个已经建立好的数据库上,我们可以通过修改SYS.PROPS$来修改主要是对应客户端的显示,与存储无关。
Www.Svn8.Com
如:
SQL> conn / as sysdba
Connected.
SQL> SQL> select * from
sys.props$
2 WHERE NAME=‘NLS_LANGUAGE’;
NAME VALUE$
NLS_LANGUAGE AMERICAN
SQL>
SQL> UPDATE sys.PROPS$ SET VALUE$=‘SIMPLIFIED
CHINESE’
2 WHERE NAME=‘NLS_LANGUAGE’;
1 row updated
SQL>
SQL> select * from sys.props$
2 WHERE NAME=‘NLS_LANGUAGE’;
NAME VALUE$
NLS_LANGUAGE SIMPLIFIED CHINESE
SQL>
通常出现问题的原因,可分为三种:
1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。
解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了,具体操作如下:
* 查看当前字符集:
SQL> select * from sys.props$
2 WHERE NAME=‘NLS_CHARACTERSET’;
NAME VALUE$
NLS_CHARACTERSET ZHS16GBK
SQL>
可以看出,现在服务器端Oracle数据库的字符集为‘ZHS16GBK’
* 根据服务器的字符集在客户端作相应的配置或者安装Oracle的客户端软件时指定:
如果还没安装客户端,那么在安装客户端时,指定与服务器相吻合的字符集即可;如果已经安装好了客户端,并且客户端为 sql*net
2.0
以下版本,进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效;否则,如果,客户端为
sql*net 2.0 以上版本,在Win98 下
运行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 Oracle, 第四步选择
NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集
(本例为:HKEY_LOCAL_MACHINE\
SOFTWARE\ORACLE\NLS_LANG :AMERICAN _ AMERICA. ZHS16GBK)。
Bbs.Svn8.Com
如果是UNIX客户端,则:
SQL> conn / as sysdba
Connected.
SQL> SQL> UPDATE sys.PROPS$ SET
VALUE$=‘SIMPLIFIED CHINESE’
2 WHERE NAME=‘NLS_LANGUAGE’;
1 row updated
SQL> COMMIT;
Commit complete
SQL>
2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。
解决方法:强制加载数据字符集与服务器端字符集一致。要做到这一点,可以通过重新创建数据库,并选择与原卸出数据一致的字符集,然后IMP数据,这种情况仅仅适用于空库和具有同一种字符集的数据。
解决这类问题,也可以先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase
格式或access格式数据库,再用转换工具转入到不同字符集的Oracle数据库中,这样就避免了Oracle字符集的困扰。目前数据库格式转换的工具很多,像power
builder5.0以上版本提供的pipeline及Microsoft Access数据库提供的数据导入/导出功能等。
Bbs.Svn8.Com
3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。
对于这种情况,目前为止都还没有太好的解决方法。
通过上面的了解,我们知道,导致在后期使用数据库时出现种种关于字符集的问题,多半是由于在数据库设计、安装之初没有很好地考虑到以后的需要,所以,我们完全可以通过在服务器上和客户端使用相同的字符集来避免由此类问题引出的麻烦
oracle insert汉字出错,oracle insert中文后,select是乱码相关推荐
- oracle insert汉字出错,Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名...
本文主要向大家介绍了Oracle数据库之Oracle批量插入数据SQL语句太长出错:无效的主机/绑定变量名,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. Oracle数据库,用 ...
- pl sql 工具insert into 中文 后, select为乱码
1 我的pl sql字符集为 配置一下环境变量即可: 2.我的电脑--> 属性---> 高级系统设置 --> 环境变量 3 配置环境变量 变量名:NLS_LANG 变量值:SIMP ...
- Oracle创建数据库出错,oracle 10g dbca创建数据库出错 急急急
oracle 10g dbca创建数据库出错 急急急 严重: 启动 Database Control 时出错 有关详细资料, 请参阅 E:\oracle\product\10.2.0\db_1\cfg ...
- oracle触发器中的after insert后继续触发,Oracle之后插入触发器
本Oracle教程解释了如何在Oracle中创建AFTER INSERT触发器的语法和示例.AFTER INSERT触发器表示Oracle将在执行INSERT操作之后触发此触发器. 语法 在Oracl ...
- oracle数据库 append,oracle中insert,copy,insert append执行对比
oracle中insert,copy,insert append执行对比 还是由于迁移数据库,测试了insert,copy,insert append的执行速度. 环境:oracle9i向oracle ...
- linux安装数据库乱码,Linux上Oracle安装前汉字乱码和安装后创建数据库乱码的解决方法...
相信每一位在Linux上安装过Oracle的朋友都受过汉字"口口"形乱码的困扰,在论坛上搜索了一下,没有找到完整的解决方案,大都是建议将Linux改成英文环境,有部分回复提到过更改 ...
- oracle insert into insert,总结下Oracle 中的Insert用法
1.标准Insert --单表单行插入 语法: INSERT INTO table [(column1,column2,...)] VALUE (value1,value2,...) 例子: inse ...
- Oracle Sql技巧 - Upsert, Multitable Insert, Undrop
近期参加OCP培训,讲师说的太快,之前一直是SQLSERVER,很多东西要恶补了. UpSert功能: MERGE <hint> INTO <table_name> USING ...
- oracle数据库中insert,【Oracle】sql插入之 insert all、insert first
Oracle插入之 insert all.insert first介绍 利用insert first/all使得INSERT语句可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表 ...
最新文章
- 根据checkbox组的选中状态给list数组赋值
- Nacos源码InstanceController
- java 使用string_java中string怎么使用
- AT1981-[AGC001C]Shorten Diameter
- c++中的函数适配器
- 到底什么是API经济
- vue.js v-for
- shiro身份验证失败捕获的异常对应信息
- Sass的安装(windows 10)
- 一、(3) 结巴分词
- g++编译时,出现test.c:(.text+0xc7):对‘cv::_InputArray::_InputArray(cv::Mat const)’未定义的引用
- Otsu最大类间方差法
- SpringBoot之使用Security
- warmup学习率训练
- 区块链主流开源技术体系介绍(转)
- iPhone的呼叫转移来电等待如何设置?
- 【GamePlay】泡泡龙核心算法
- 两数之和(Two Sum)
- word标尺灰色_如何在Microsoft Word中更改标尺测量单位
- Dialer中界面组成、Call对象和log分析