Oracle:从 WE8ISO8859P1 转换为 AL32UTF8

Posted

技术标签:

【中文标题】Oracle:从 WE8ISO8859P1 转换为 AL32UTF8【英文标题】:Oracle: Conversion from WE8ISO8859P1 to AL32UTF8 【发布时间】:2017-07-02 22:53:51 【问题描述】:

我正在尝试整合一些数据库,但我在使用 CHARACTER Sets 时遇到了一些问题。

我的数据库如下所示:

源数据库

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
NLS_CHARACTERSET    WE8ISO8859P1
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_LENGTH_SEMANTICS    BYTE

目标数据库

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
NLS_CHARACTERSET    AL32UTF8
NLS_NCHAR_CHARACTERSET  AL16UTF16
NLS_LENGTH_SEMANTICS    BYTE

我导出了一个模式,但是当我导入新数据库时,我遇到了很多错误,例如:

ORA-02374: conversion error loading table owner.table_name
ORA-12899: value too large for column col_name (actual: 403, maximum: 400)

我已经运行了 csscan 实用程序。结果如下:

TABLE   Convertible    Truncation        Lossy
------ ------------- ------------- ------------
    1            0             18           24
    2        2,248            120       19,854
    3        2,155            120       19,551
    4        5,431            294       41,531
    5        5,925            114       18,352
    6          129              4        5,095
    7          109              4        5,017
    8        2,149            151        5,219
------ ------------- ------------- -------------

那么,有什么方法可以在导入前找出目的地中 VARCHAR2 的值?我可以改变表格的结构。在我们的示例中,我可以更改我的表并将列的大小从 400 修改为 403。

如果您需要更多信息或其他任何内容,请发表评论。

提前致谢!

【问题讨论】:

我的问题仍然没有解决方案。有任何想法吗?提前致谢! 【参考方案1】:

csscan 工具会告诉您转换后 Truction 记录的大小,您可以使用它来更改字段的大小。在以下示例中,您需要将 SAMPLE_COLUMN 的大小从 VARCHAR(40) 更改为 VARCHAR(43) 以涵盖正在转换的所有内容:

csscan .err 示例输出:

User  : SAMPLE_USER
Table : SAMPLE_TABLE
Column: SAMPLE_COLUMN
Type  : VARCHAR2(40)
Number of Exceptions         : 5
Max Post Conversion Data Size: 43  

希望这会有所帮助。

【讨论】:

以上是关于Oracle:从 WE8ISO8859P1 转换为 AL32UTF8的主要内容,如果未能解决你的问题,请参考以下文章

Oracle转换函数

oracle ---中文乱码问题

oracle官方文档- length篇

oracle 10如何修改字符集?

sqlldr 采集中文数据乱码问题

给aix 系统增加中文字符集,该怎么处理