- 本期学习
什么是 Oracle 字符集、字符集的相关知识、字符编码方案、 数据库字符集(oracle 服务器端字符集)、EXP/IMP 与 字符集 - 1、什么是 Oracle 字符集
- Oracle 字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
- 影响 Oracle 数据库字符集最重要的参数是 NLS_LANG 参数。
- 它的格式如下: NLS_LANG = language_territory.charset
- 它有三个组成部分(语言、地域和字符集),每个成分控制了 NLS 子集的特性。其中:
- Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
- Territory: 指定服务器的日期和数字格式,
- Charset: 指定字符集。
- 如:AMERICAN _ AMERICA. ZHS16GBK从 NLS_LANG 的组成我们可以看出,真正影响数据库字符集的其实是第三部分。所以两个数据库之间的字符集只要第三部分一样就可以相互导入导出数据,前面影响的只是提示信息是中文还是英文。
- Language: 指定服务器消息的语言, 影响提示信息是中文还是英文
- 影响 Oracle 数据库字符集最重要的参数是 NLS_LANG 参数。
- Oracle 字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系。ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据。它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台。
- 2、字符集相关知识
- 1、字符集
- 实质就是按照一定的字符编码的方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII.
- Oracle 的字符集命名遵循以下命名规则:
- 即: <语言><比特位数><编码>比如: ZHS16GBK
- 表示采用 GBK 编码格式、16 位(两个字节)简体中文字符集
- Oracle 的字符集命名遵循以下命名规则:
- 实质就是按照一定的字符编码的方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII.
- 2、字符编码方案
- 单字节编码
- 单字节7位字符集,可以定义128个字符,最常用的字符集为 US7ASCII
- 单字节8位字符集,可以定义 256 个字符,适合于欧洲大部分国家例如:WE8ISO8859P1(西欧、8 位、ISO 标准 8859P1 编码)
- 单字节7位字符集,可以定义128个字符,最常用的字符集为 US7ASCII
- 多字节编码
- 变长多字节编码
- 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持, 例如日语、汉语、印地语等
- 例如:AL32UTF8(其中 AL 代表 ALL,指适用于所有语言)、zhs16cgb231280
- 例如:AL32UTF8(其中 AL 代表 ALL,指适用于所有语言)、zhs16cgb231280
- 某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持, 例如日语、汉语、印地语等
- 定长多字节编码
- 每一个字符都使用固定长度字节的编码方案,目前 oracle 唯一支持的定长多字节编码是 AF16UTF16,也是仅用于国家字符集
- 每一个字符都使用固定长度字节的编码方案,目前 oracle 唯一支持的定长多字节编码是 AF16UTF16,也是仅用于国家字符集
- 变长多字节编码
- unicode 编码
- Unicode 是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说 Unicode 为每一个字符提供唯一的编码。UTF-16 是 unicode 的 16 位编码方式,是一种定长多字节编码,用 2 个字节表示一个 unicode 字符,AF16UTF16是 UTF-16 编码字符集。
- UTF-8 是 unicode 的 8 位编码方式,是一种变长多字节编码,这种编码可以用1、2、3 个字节表示一个 unicode 字符,AL32UTF8,UTF8、UTFE 是 UTF-8 编码字符集
- Unicode 是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说 Unicode 为每一个字符提供唯一的编码。UTF-16 是 unicode 的 16 位编码方式,是一种定长多字节编码,用 2 个字节表示一个 unicode 字符,AF16UTF16是 UTF-16 编码字符集。
- 单字节编码
- 3、字符集超级
- 当一种字符集(字符集 A)的编码数值包含所有另一种字符集(字符集 B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集 A 是字符集 B 的超级,或称字符集 B 是字符集 A 的子集。
- Oracle 官方文档资料中有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1 是 WE8MSWIN1252 的子集。由于 US7ASCII 是最早的 Oracle数据库编码格式,因此有许多字符集是 US7ASCII 的超集,例如 WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK 都是 US7ASCII 的超集。
- 当一种字符集(字符集 A)的编码数值包含所有另一种字符集(字符集 B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集 A 是字符集 B 的超级,或称字符集 B 是字符集 A 的子集。
- 4、数据库字符集(oracle 服务器端字符集)
- 数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集 (CHARACTER SET) 和国家字符集 (NATIONALCHARACTER SET)。
- 字符集
- (1)用来存储 CHAR, VARCHAR2, CLOB, LONG 等类型数据
- (2)用来标示诸如表名、列名以及 PL/SQL 变量等
- (3)用来存储 SQL 和 PL/SQL 程序单元等
- (1)用来存储 CHAR, VARCHAR2, CLOB, LONG 等类型数据
- 国家字符集
- (1)用以存储 NCHAR, NVARCHAR2, NCLOB 等类型数据
- (2)国家字符集实质上是为 oracle 选择的附加字符集,主要作用是为了增强oracle 的字符处理能力,因为 NCHAR 数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在 oracle9i 中进行了重新定义,只能在 unicode 编码中的 AF16UTF16 和 UTF8 中选择,默认值是 AF16UTF16
- (1)用以存储 NCHAR, NVARCHAR2, NCLOB 等类型数据
- 查询字符集参数
- 可以查询以下数据字典或视图查看字符集设置情况nls_database_parameters、props$、v$nls_parameters 查 询 结 果 中 NLS_CHARACTERSET 表 示 字 符 集 ,NLS_NCHAR_CHARACTERSET 表示国家字符集
- 可以查询以下数据字典或视图查看字符集设置情况nls_database_parameters、props$、v$nls_parameters 查 询 结 果 中 NLS_CHARACTERSET 表 示 字 符 集 ,NLS_NCHAR_CHARACTERSET 表示国家字符集
- 修改数据库字符集
- 按照上文所说,数据库字符集在创建后原则上不能更改。不过有 2 种方法可行。
- (1) 如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
- (2) 通过 ALTER DATABASE CHARACTER SET 语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如 UTF8 是 US7ASCII 的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。
- (1) 如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
- 按照上文所说,数据库字符集在创建后原则上不能更改。不过有 2 种方法可行。
- 字符集
- 数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集 (CHARACTER SET) 和国家字符集 (NATIONALCHARACTER SET)。
- 5、客户端字符集(NLS_LANG 参数)
- 1 、客户端字符集含义
- 客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看做是能与数据库直连结的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设置的。
- 客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看做是能与数据库直连结的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设置的。
- 2、 NLS_LANG 参数格式
- NLS_LANG= Language_.Territory.Client character set
- Language: 显示 oracle 消息,校验,日期命名
- Territory:指定默认日期、数字、货币等格式
- Client character set:指定客户端将使用的字符集
- 例如:NLS_LANG=AMERICAN_AMERICA.US7ASCIIAMERICAN 是语言,AMERICA 是地区,US7ASCII 是客户端字符集
- NLS_LANG= Language_.Territory.Client character set
- 3、客户端字符集设置方法
- 1)UNIX 环境$NLS_LANG=―simplified chinese‖_china.zhs16gbk$export NLS_LANG编辑 oracle 用户的 profile 文件
- 2)Windows 环境编辑注册表Regedit.exe --- 》 HKEY_LOCAL_MACHINE --- 》 SOFTWARE --- 》ORACLE-HOME
- 1)UNIX 环境$NLS_LANG=―simplified chinese‖_china.zhs16gbk$export NLS_LANG编辑 oracle 用户的 profile 文件
- 4、NLS 参数查询
- Oracle 提供若干 NLS 参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER 等,可以通过查询以下数据字典或 v$视图查看。
- NLS_DATABASE_PARAMETERS:显示数据库当前 NLS 参数取值,包括数据库字符集取值
- NLS_SESSION_PARAMETERS: 显示由 NLS_LANG 设置的参数,或经过 alter session 改变后的参数值(不包括由 NLS_LANG 设置的客户端字符集)
- NLS_INSTANCE_PARAMETE: 显示由参数文件 init.ora 定义的参数
- V$NLS_PARAMETERS:显示数据库当前 NLS 参数取值
- Oracle 提供若干 NLS 参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER 等,可以通过查询以下数据字典或 v$视图查看。
- 5、修改NLS 参数
- 使用下列方法可以修改 NLS 参数
- (1)修改实例启动时使用的初始化参数文件
- (2)修改环境变量 NLS_LANG
- (3)使用 ALTER SESSION 语句,在 oracle 会话中修改
- (4)使用某些 SQL 函数NLS 作用优先级别:Sql function > alter session > 环境变量或注册表 > 参数文件>数据库默认参数。
- 使用下列方法可以修改 NLS 参数
- 1 、客户端字符集含义
- 1、字符集
- 3、数据泵导出 与 字符集
- 1、 EXP/IMP
- Export 和 Import 是一对读写 Oracle 数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到 Oracle 数据库中,由于使用 exp/imp 进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
- EXP
- ____________ _________________ _____________
- |imp 导入文件|<-|环境变量 NLS_LANG|<-|数据库字符集|
- ------------ ----------------- -------------
- IMP
- ____________ _________________ _____________
- |imp 导入文件|->|环境变量 NLS_LANG|->|数据库字符集|
- ------------ ----------------- -------------
- 四个字符集是(1)源数据库字符集(2)Export 过程中用户会话字符集(通过 NLS_LANG 设定)(3)Import 过程中用户会话字符集(通过 NLS_LANG 设定)(4)目标数据库字符集
- Export 和 Import 是一对读写 Oracle 数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到 Oracle 数据库中,由于使用 exp/imp 进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。
- 2 、导出的转换过程
- 在 Export 过程中,如果源数据库字符集与 Export 用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储 Export 用户会话字符集的 ID 号。在这个转换过程中可能发生数据的丢失。
- 例:如果源数据库使用 ZHS16GBK,而 Export 用户会话字符集使用US7ASCII,由于 ZHS16GBK 是 16 位字符集,而 US7ASCII 是 7 位字符集,这个转换过程中,中文字符在 US7ASCII 中不能够找到对等的字符,所以所有中文字符都会丢失而变成―?? ‖形式,这样转换后生成的 Dmp 文件已经发生了数据丢失。
- 因此如果想正确导出源数据库数据,则 Export 过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集
- 在 Export 过程中,如果源数据库字符集与 Export 用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储 Export 用户会话字符集的 ID 号。在这个转换过程中可能发生数据的丢失。
- 3、导入的转换过程
- (1)确定导出数据库字符集环境:通过读取导出文件头,可以获得导出文件的字符集设置
- (2)确定导入 session 的字符集,即导入 Session 使用的 NLS_LANG 环境变量
- (3)IMP 读取导出文件读取导出文件字符集 ID,和导入进程的 NLS_LANG 进行比较
- (4)如果导出文件字符集和导入 Session 字符集相同,那么在这一步骤内就不需要转换,如果不同,就需要把数据转换为导入 Session 使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换
- 第一次:导入文件字符集与导入 Session 使用的字符集之间的转换,如果这个转换过程不能正确完成,Import 向目标数据库的导入过程也就不能完成。第二次:导入 Session 字符集与数据库字符集之间的转换。
- (1)确定导出数据库字符集环境:通过读取导出文件头,可以获得导出文件的字符集设置
- 4、查看数据库字符集
- 涉及三方面的字符集,1. oracelserver 端的字符集; 2. oracle client 端的字符集; 3. dmp 文件的字符集。
- 4.1查询 oracle server 端的字符集
- 有很多种方法可以查出 oracle server 端的字符集,比较直观的查询方法是以下这种:
- SQL> select userenv('language') from dual;
- USERENV('LANGUAGE')
- ----------------------------------------------------
- SIMPLIFIED CHINESE_CHINA.ZHS16GBK
- SQL>select userenv(‗language‘) from dual;
- AMERICAN _ AMERICA. ZHS16GBK
- 有很多种方法可以查出 oracle server 端的字符集,比较直观的查询方法是以下这种:
- 4.2如何查询 dmp 文件的字符集
- 用 oracle 的 exp 工具导出的 dmp 文件也包含了字符集信息,dmp 文件的第 2和第 3 个字节记录了 dmp 文件的字符集。如果 dmp 文件不大,比如只有几 M 或几十 M,可以用 UltraEdit 打开(16 进制方式),看第 2 第 3 个字节的内容,如 0354,然后用以下 SQL 查出它对应的字符集: SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;ZHS16GBK 。 如果 dmp 文件很大,比如有 2G 以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在 unix 主机上):cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6然后用上述 SQL 也可以得到它对应的字符集。
- 用 oracle 的 exp 工具导出的 dmp 文件也包含了字符集信息,dmp 文件的第 2和第 3 个字节记录了 dmp 文件的字符集。如果 dmp 文件不大,比如只有几 M 或几十 M,可以用 UltraEdit 打开(16 进制方式),看第 2 第 3 个字节的内容,如 0354,然后用以下 SQL 查出它对应的字符集: SQL> select nls_charset_name(to_number('0354','xxxx')) from dual;ZHS16GBK 。 如果 dmp 文件很大,比如有 2G 以上(这也是最常见的情况),用文本编辑器打开很慢或者完全打不开,可以用以下命令(在 unix 主机上):cat exp.dmp |od -x|head -1|awk '{print $2 $3}'|cut -c 3-6然后用上述 SQL 也可以得到它对应的字符集。
- 4.3查询 oracle client 端的字符集
- 在 windows 平台下,就是注册表里面相应 OracleHome 的 NLS_LANG。还可以在 dos 窗口里面自己设置,
- 比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
- 这样就只影响这个窗口里面的环境变量。
- 比如: set nls_lang=AMERICAN_AMERICA.ZHS16GBK
- 在 unix 平台下,就是环境变量 NLS_LANG。
- $echo $NLS_LANGAMERICAN_AMERICA.ZHS16GBK
- 如果检查的结果发现 server 端与 client 端字符集不一致,请统一修改为同server 端相同的字符集。
- 补充:(1).数据库服务器字符集select * from nls_database_parameters来源于 props$,是表示数据库的字符集。
- (2).客户端字符集环境select * from nls_instance_parameters其来源于 v$parameter,表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表
- (3).会话字符集环境select * from nls_session_parameters来源于 v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session 完成,如果会话没有特殊的设置,将与 nls_instance_parameters 一致。
- (4).客户端的字符集要求与服务器一致,才能正确显示数据库的非 Ascii 字符。如果多个设置存在的时候,NLS 作用优先级别:Sql function > alter session >环境变量或注册表 > 参数文件 > 数据库默认参数字符集要求一致,但是语言设置却可以不同,语言设置建议用英文。如字符集是 zhs16gbk,则 nls_lang 可以是 American_America.zhs16gbk。
- 在 windows 平台下,就是注册表里面相应 OracleHome 的 NLS_LANG。还可以在 dos 窗口里面自己设置,
- 涉及三方面的字符集,1. oracelserver 端的字符集; 2. oracle client 端的字符集; 3. dmp 文件的字符集。
- 5、修改Oracle的字符集
- 按照上文所说,数据库字符集在创建后原则上不能更改。因此,在设计和安装之初考虑使用哪一种字符集十分重要。对数据库 server 而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改 oracle 数据库 server 端的字符集。特别说明,我们最常用的两种字符集 ZHS16GBK 和 ZHS16CGB231280 之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
- 不过修改字符集有 2 种方法可行。
- 1. 通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换。
- 2. 通过 ALTER DATABASE CHARACTER SET 语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如 UTF8 是 US7ASCII 的超集,修改数据库字符集可使用 ALTERDATABASE CHARACTER SET UTF8。
- 5.1修改server端字符集(不建议使用)
- 1. 关闭数据库 SQL>SHUTDOWN IMMEDIATE
- 2. 启动到 Mount SQL>STARTUP MOUNT;SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;SQL>ALTER DATABASE OPEN;
- --这里可以从父集到子集
- SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
- SQL>ALTER DATABASE NATIONAL CHARACTER SET ZHS16GBK;--如果是从子集到父集,需要使用 INTERNAL_USE 参数,跳过超子集检测
- SQL>ALTER DATABASE CHARACTER SET INTERNAL_USE AL32UTF8;
- SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USEAL32UTF8;
- SQL>SHUTDOWN IMMEDIATE;
- SQL>STARTUP
- 注意:如果没有大对象,在使用过程中进行语言转换没有什么影响,(切记设定的字符集必须是 ORACLE 支持,不然不能 start) 按上面的做法就可以。
- 若出现‗ORA-12717: Cannot ALTER DATABASE NATIONAL CHARACTERSET when NCLOB data exists‘ 这样的提示信息,要解决这个问题有两种方法1. 利用 INTERNAL_USE 关键字修改区域设置,2. 利用 re-create,但是 re-create 有点复杂,所以请用 internal_use
- SQL>SHUTDOWN IMMEDIATE;
- SQL>STARTUP MOUNT EXCLUSIVE;
- SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
- SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
- SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;SQL>ALTER DATABASE OPEN;
- SQL>ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USEUTF8;
- SQL>SHUTDOWN immediate;
- SQL>startup;如果按上面的做法做,National charset 的区域设置就没有问题
- 1. 关闭数据库 SQL>SHUTDOWN IMMEDIATE
- 5.2修改dmp文件字符集
- dmp 文件的第 2 第 3 字节记录了字符集信息,
- 因此直接修改 dmp文件的第 2 第 3 字节的内容就可以‗骗‘过 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 无法打开,就需要用程序的方法了。
- dmp 文件的第 2 第 3 字节记录了字符集信息,
- 5.3客户端字符集设置方法
- 1)UNIX 环境$NLS_LANG=―simplified chinese‖_china.zhs16gbk$export NLS_LANG编辑 oracle 用户的 profile 文件
- 2)Windows 环境编辑注册表Regedit.exe --- 》 HKEY_LOCAL_MACHINE --- 》 SOFTWARE --- 》或者在窗口设置:set nls_lang=AMERICAN_AMERICA.ZHS16GBK
- 1)UNIX 环境$NLS_LANG=―simplified chinese‖_china.zhs16gbk$export NLS_LANG编辑 oracle 用户的 profile 文件
- 5.1修改server端字符集(不建议使用)
- 按照上文所说,数据库字符集在创建后原则上不能更改。因此,在设计和安装之初考虑使用哪一种字符集十分重要。对数据库 server 而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行,所以在修改之前一定要确认两种字符集是否存在子集和超集的关系。一般来说,除非万不得已,我们不建议修改 oracle 数据库 server 端的字符集。特别说明,我们最常用的两种字符集 ZHS16GBK 和 ZHS16CGB231280 之间不存在子集和超集关系,因此理论上讲这两种字符集之间的相互转换不受支持。
- 1、 EXP/IMP
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




