ORA-12704:字符集不匹配错误

首先查看ORACLE 服务器与客户端的字符集是否一致,如果不一致那么按以下信息修改:Oracle 字符集的查看和修改

如果一致,那么可能是数据类型的问题,请继续往下看。

当执行语句1出现ORA-12704:字符集不匹配错误。

--语句1

SELECT
       CASE
           WHEN GY_FS = '1' AND TD_YT = '076' THEN '074'
         ELSE TD_YT
        END AS TD_YT
FROM T_GDXM

原因是TD_YT的数据类型是NVARCHAR2

解决办法:把'074' 改为Translate('074' USING NCHAR_CS) 就可以了。

同理:执行以下语句2:

SELECT
       CASE
           WHEN GY_FS = '1' AND TD_YT = '076' THEN Translate('074' USING NCHAR_CS)         

          ELSE TD_YT
        END AS TD_YT
FROM T_GDXM

当TD_YT的数据类型为VARCHAR2时,执行出现ORA-12704:字符集不匹配错误。

解决办法:把语句2改为语句1。

Oracle中NVARCHAR2与VARCHAR2的区别:

NVARCHAR2数据类型:

1.nvarchar/nvarchar2用于存储可变长度的字符串。
2.size 的最大值是4000,而最小值是1,其值表示字符的个数,而不是字节数。
3.这两种类型更适合存储中文。

NVARCHAR2数据类型是仅使用Unicode数据类型。当你创建一个NVARCHAR2列的表,你提供它可以容纳的字符的最大数量。甲骨文随后存储每列中的值完全按照您指定提供的价值不超过列的最大长度。

列的最大长度,是由国家字符集定义。宽度规格的字符数据类型NVARCHAR2指的字符数。允许的最大列大小为4000字节。请参阅Oracle数据库全球化支持指南的信息,对Unicode数据类型支持。

VARCHAR2数据类型:

1.varchar/varchar2用于存储可变长度的字符串。
  比如:varchar(20),存入字符串'abc',则数据库中该字段只占3个字节,而不是20个字节
2.size 的最大值是 4000,而最小值是1,其值表示字节数。

 比如:varchar(20)表示最大可以存放20个字节的内容

VARCHAR2数据类型指定一个可变长度的字符串。当你创建一个VARCHAR2列,您提供的数据,它可以容纳的字节或字符的最大数量。甲骨文随后存储每列中的值完全按照您指定的值不超过列的最大长度的列。如果您尝试插入值超过指定的长度,则Oracle返回一个错误。

你必须指定一个VARCHAR2列的最大长度。最大必须至少有1个字节,但实际存储的字符串是允许的,是一个零长度字符串('')。可以使用CHAR预选赛,例如VARCHAR2(10 CHAR),,给予最大长度的字符,而不是字节。字符是技术上的数据库字符集代码点。 CHAR和BYTE的预选赛将覆盖的NLS_LENGTH_SEMANTICS参数的设置,有一个默认的字节。出于性能方面的原因,Oracle建议您使用NLS_LENGTH_SEMANTICS,参数设置长度语义和您使用BYTE和CHAR预选赛,只有在必要时覆盖参数,。 VARCHAR2数据的最大长度为4000字节。甲骨文比较的VARCHAR2值使用nonpadded比较语义。

为了确保正确使用不同字符集的数据库之间的数据转换,你必须确保,VARCHAR2数据由形成的字符串。字符集支持的更多信息,请参阅Oracle数据库全球化支持指南。

VARCHAR数据类型

不要使用VARCHAR数据类型。而不是使用VARCHAR2数据类型。 VARCHAR数据类型虽然目前VARCHAR数据类型VARCHAR2的代名词,计划重新定义为一个单独的数据类型相比,具有不同的比较语义用于可变长度的字符串。

【注意】
VARCHAR2是Oracle提供的特定数据类型,Oracle可以保证VARCHAR2在任何版本中该数据类型都可以向上和向下兼容。
VARCHAR在Oracle中不建议使用。

具体到NVARCHAR2和VARCHAR2的区别,从使用角度来看区别在于:NVARCHAR2在计算长度时和字符集相关的,例如数据库是中文字符集时以长度10为例,则
1、NVARCHAR2(10)是可以存进去10个汉字的,如果用来存英文也只能存10个字符。
2、而VARCHAR2(10)的话,则只能存进5个汉字,英文则可以存10个。

 

 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值