当前位置: 主页 > 数据库

设置mysql数据库字符集-mysql的mysql库下载

发布时间:2023-02-08 22:18   浏览次数:次   作者:佚名

什么是 Oracle 字符集? Oracle 字符集是由字节数据解释的符号集合,可以分为大小和相互包含。 Oracle 的本国语言架构允许您使用本地化的语言来存储、处理和检索数据。它自动使数据库工具、错误消息、排序顺序、日期、时间、货币、数字和日历适应这一点

什么是Oracle字符集

Oracle字符集是按字节数据解释的符号集合,按大小划分,相互之间存在包含关系。

Oracle 的本地语言架构允许您使用本地化的语言来存储、处理和检索数据。 它自动使数据库工具、错误消息、排序顺序、日期、时间、货币、数字和日历适应本地化语言和平台。

影响oracle数据库字符集的最重要的参数是NLS_LANG参数。 它具有以下格式:

NLS_LANG = language_territory.charset

它具有三个组件(语言、区域和字符集),每个组件控制一个 NLS 子集的特征。 在:

Language 指定服务器消息的语言,territory 指定服务器的日期和数字格式,charset 指定字符集。 如:AMERICAN_AMERICA。 ZHS16GBK。

从NLS_LANG的组成可以看出,第三部分其实是影响数据库字符集的。 因此,只要两个数据库之间的字符集与第三方相同,就可以相互导入导出数据。 之前的效果只是提示信息是中文还是英文。

如何查询Oracle的字符集

很多人都遇到过因为字符集不同导致数据导入失败的情况。 这里涉及三个字符集,一个是oracle server端的字符集,一个是oracle client端的字符集; 第三个是dmp文件的字符集。 导入数据时,这三个字符集需要保持一致才能正确导入。

1、查询Oracle Server的字符集

有很多方法可以找出oracle服务器的字符集。 更直观的查询方式如下:

SQL>select userenv('language') from dual;

结果类似于以下内容:AMERICAN_AMERICA.ZHS16GBK。

2、如何查询dmp文件的字符集

Oracle的exp工具导出的dmp文件也包含字符集信息,dmp文件的第二个和第三个字节记录了dmp文件的字符集。 如果dmp文件不大,比如只有几M或者几十M,可以用UltraEdit打开(十六进制),看第二个和第三个字节的内容,比如0354,然后用下面的SQL找出其对应的字符集:

SQL> 从 dual 中选择 nls_charset_name(to_number('0354','xxxx')); ZHS16GBK

如果dmp文件很大,比如超过2G(这也是最常见的情况),用文本编辑器打开很慢或者根本打不开,可以使用如下命令(在unix上主持人):

cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6

然后使用上面的SQL获取其对应的字符集。

3、查询Oracle客户端的字符集

这个比较简单。 Windows平台下,对应注册表中的OracleHome为NLS_LANG。 也可以在Dos窗口中自己设置,例如:

设置 nls_lang=AMERICAN_AMERICA.ZHS16GBK

这只会影响此窗口中的环境变量。 在Unix平台下,是环境变量NLS_LANG。

$echo $NLS_LANG AMERICAN_AMERICA.ZHS16GBK

如果检查结果显示服务器端的字符集与客户端不一致,请修改为与服务器端相同的字符集。

修改Oracle的字符集

上面说了,oracle的字符集是相互包容的。

例如,us7ascii 是 zhs16gbk 的子集。 从us7ascii到zhs16gbk,不会有数据解释问题,也不会丢失数据。 utf8应该是所有字符集中最大的,因为它是基于unicode的,双字节保存字符(因此占用存储空间较多)。

数据库一旦创建,数据库的字符集理论上是不能改变的。 因此,在设计和安装之初就考虑使用哪种字符集是非常重要的。 根据Oracle官方说明,字符集支持从子集到超集的转换,反之则不支持。 如果两个字符集之间没有子集和超集关系,那么oracle不支持字符集的转换。 对于数据库服务器来说,不正确地修改字符集会导致很多不可预知的后果,可能会严重影响数据库的正常运行。 因此,修改前需要确认两个字符集的子集和超集之间是否存在关系。 一般来说设置mysql数据库字符集,除非绝对必要,否则我们不建议修改oracle数据库服务器端的字符集。 特别是最常用的两个字符集ZHS16GBK和ZHS16CGB231280之间没有子集和超集关系,所以理论上不支持这两个字符集之间的相互转换。

修改服务端字符集(不推荐):

在Oracle 8之前,可以通过直接修改数据字典表props$来改变数据库的字符集。 但是在Oracle8之后,记录数据库字符集信息的系统表至少有3个,只改变props$表是不完整的,可能会造成严重的后果。 正确的修改方法如下:

$sqlplus /nolog SQL>conn /as sysdba;

如果此时数据库服务器启动,首先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:

SQL>启动安装;

SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;

SQL> 改变数据库打开;

SQL> 更改数据库字符集 ZHS16GBK;

SQL>ALTER DATABASE 国家字符集 ZHS16GBK;

SQL>立即关闭; SQL>启动

修改dmp文件字符集:

上面说了dmp文件的第二个和第三个字节记录的是字符集信息,所以直接修改dmp文件第二个和第三个字节的内容就可以“骗”过oracle的检查。 理论上,这只能从子集修改为超集,但很多情况下也可以在没有子集和超集关系的情况下修改。 我们常用的一些字符集,如US7ASCII、WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK,基本上都可以改。 因为只是改了dmp文件,所以影响不大。

具体的修改方法有很多,最简单的就是直接用UltraEdit修改dmp文件的第2、3字节。 例如,如果要将dmp文件的字符集更改为ZHS16GBK,可以使用如下SQL找出该字符集对应的16进制码:

SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual; 0354

然后修改dmp文件的2、3字节为0354。

如果dmp文件很大,用ue打不开,就需要用程序的方法。 网上有人用java存储过程写了一个转换程序(用java存储过程的优点是通用设置mysql数据库字符集,缺点是比较麻烦)。 我在Windows下测试过。 但要求Oracle数据库必须安装JVM选项。