YonyouSoftwareCorporation用友软件股份有限公司雷鹏2013年8月17日数据库字符集交流YonyouSoftwareCorporation一.什么是字符集,什么是字符编码.举例说明字符集与乱码的关系二.数据备份还原时字符集的变化.备份数据还原数据时字符集如何设置主题YonyouSoftwareCorporation字符集是什么,字符编码是什么?简单的说字符集就是各种符号的集合,例如A,B,C等符号,字符编码是一套规则,这套规则定义了各种符号和计算机能识别的代码之间的对应关系。例如:在ASCII字符集中我们输入A,在ASCII字符集的作用下,传给计算机6565就是通过ASCII将符号A转换为计算机可以接受的代码65不同的字符集会所包含的符号数量不相等,字符编码规则可能也不一样,那么在字符集转换的时候,就可能会一些字符识别不了,或者因为字符编码不同,转换出来的字符和原先的字符不一致,进而产生乱码现象。字符集与字符编码A十进制:65YonyouSoftwareCorporation为什么查询数据的时候看到乱码?乱码是什么时候产生的?乱码和字符集有什么关系?举例说明字符集与乱码的关系YonyouSoftwareCorporation数据库字符集:数据库内编码、解码数据采用的字符集合操作系统字符集:操作系统编码、解码数据采用的字符集合。系统字符集代码936相当于oracle的字符集ZHS16GBK怎么去查看数据库和操作系统的字符集?查看字符集YonyouSoftwareCorporation客户端字符集:oracle客户端采用的字符集,oracle的产品工具使用的字符集,如sqlplus,exp/imp。由NLS_LANG定义。注册表,环境变量,session变量优先级:session变量>环境变量>注册表客户端字符集YonyouSoftwareCorporation用一个例子来说明乱码和字符集的关系实验:YonyouSoftwareCorporation插入数据2,用友更换oracle客户端字符集为AL32UTF8YonyouSoftwareCorporation在ZHS16GBK下查看两行数据YonyouSoftwareCorporation在AL32UTF8下查看两行数据YonyouSoftwareCorporation两次在不同客户端字符集(NLS_LANG)设置下,输入“用友”,字符编码不同,为什么呢?查看表test里“用友”的字符编码YonyouSoftwareCorporation客户端字符集的作用就是告诉数据库我们传递过去的字符是属于哪种字符集,以便oracle在存储字符的时候进行对应的编码映射。设置oracle客户端字符集的作用YonyouSoftwareCorporation操作系统字符集为936,这个等同于ZHS16GBK对应。先看col2,我们在输入“用友”时,会根据操作系统字符集取出用友的编码。而我们设置了客户端字符集是AL32UTF8,数据库本身字符集也是AL32UTF8,那么数据库就认为字符集一致,就不会做编码的转换,直接把用友在ZHS16GBK里的编码传输到数据库里,就是:d3,c3,d3,d1设置oracle客户端字符集的作用YonyouSoftwareCorporation再看col1,设置了客户端字符集为ZHS16GBK,而数据库的字符集为AL32UTF8,那么写入到数据库时,oracle会进行编码的转换,把用友在ZHS16GBK的编码转换成成在AL32UTF8里的编码。那么e7,94,a8,e5,8f,8b就是用友在AL32UTF8里的编码。设置oracle客户端字符集的作用YonyouSoftwareCorporation设置字符集为ZH16GBK,查看test表,第一行正常,第二行显示?数据库的字符集是AL32UTF8,设置了客户端的字符集为ZHS16GBK,那么oracle从表里取出字符时,会做一个编码的转换,第一行字符编码e7,94,a8,e5,8f,8b会从AL32UTF8的编码形式转换成ZH16GBK的编码形式。我们已经知道e7,94,a8,e5,8f,8b的AL32UTF8对应的ZH16GBK的编码形式是d3,c3,d3,d1。而d3,c3,d3,d1在系统编码(936对应ZH16GBK)里对应的字符就是用友,所以显示正常。而第二行编码d3,c3,d3,d1也会做一个从AL32UTF8到ZH16GBK的转换,转换过后,ZH16GBK字符集没有对应的字符集编码,所以使用了?来代替,于是就变成了这样的乱码显示乱码的原因YonyouSoftwareCorporation设置字符集为AL32UTF8,查看test表,第一行显示正常,第二行显示乱码。数据库的字符集是AL32UTF8,设置了客户端的字符集为AL32UTF8,那么oracle从表里取出字符时,不会做编码的转换,第二行字符编码是d3,c3,d3,d1,d3,c3,d3,d1在系统编码(936对应ZH16GBK)里对应的字符就是用友,所以显示正常。e7,94,a8,e5,8f,8b同样也不会转化,e7,94,a8,e5,8f,8b在ZH16GBK编码里对应的字符就是“鐢ㄥ弸”,所以会显示乱码。显示乱码的原因YonyouSoftwareCorporation乱码:对于从数据库里传输过来的数字码,操作系统字符集里对于此数字码,无对应的字符,或者对应的字符不正确。显示乱码的原因之一YonyouSoftwareCorporation二.数据备份还原时字符集的变化.备份数据还原数据时字符集如何设置YonyouSoftwareCorporation数据从一个库导出,导入到另一个库后,在这个过程中数据文件的字符集发生了什么样的变化?Exp,imp是ORACLE的工具,是按照NLS_LANG来定义字符集。导出exp时,客户端字符集一致数据库字符集,则正常导出;若不一致,则在导出时会发生字符集转换。会转换成客户端的字符集。导入导出文件时设置字符集YonyouSoftwareCorporation在导出数据时,导出文件使用的字符集是客户端的字符集。数据库字符集和导出的客户端字符集一致,则正常导出,导出文件字符集不发生变化,字符集为客户端字符集。导出文件的字符集可以通过导出的导出文件的头部几个字节来查看。查看数据文件字符集YonyouSoftwareCorporation查看数据文件字符集YonyouSoftwareCorporation导出文件的字符集可以通过导出的dump文件的头部几个字节来查看。查看数据文件字符集YonyouSoftwareCorporation把此文件拿到window环境下查看导出文件的字符集可以通过导出文件的头部几个字节来查看。查看数据文件字符集YonyouSoftwareCorporation导出文件的字符集可以通过导出文件的头部几个字节来查看。打开导出文件做对比YonyouSoftwareCorporation导出文件的字符集是根据客户端字符集决定的,如果数据库本身的字符集和你设定的字符集不一致,则发生转换,会转换成客户端字符集(由NLS_LANG定义)。在转换过程中,如果数据库里的某些字符在客户端的字符集里找不到对等的字符,可能发生数据的丢失。导出过程中客户端字符集应等于源数据库字符集或是源数据库字符集的超集。导出文件字符集YonyouSoftwareCorporation导入时:导入文件字符集,客户端字符集,数据库字符集客户端导入工具会读取导入文件的字符集,把它和客户端字符集做比较,如果一致,则不会做转换。如果不一致,则做第一次转换。当数据转换为客户端字符集以后,如果导入Session字符集不同于导入数据库字符集,这时还需要最后一步转换。导入过程字符集转换YonyouSoftwareCorporation导入过程字符集转换YonyouSoftwareCorporation宗旨:尽量少发生字符集的转换。导出时:设定客户端字符集NLS_LANG与数据库字符集相同,使导出过程不发生字符集的转换。导入时:数据文件客户端字符集数据库设定客户端字符集与数据文件字符集一致,使得数据文件到客户端字符集这个过程不发生字符转换。如果源文件字符集与数据库字符集不一致,那么字符集必定发生变化。那么我们尽量让字符转换这个过程放到数据库里进行,安全性更有保证。总结:导入导出时如何设置字符集YonyouSoftwareCorporation谢谢大家!