SQL Server到具有非英语字符的Oracle的数据长度问题

时间:2019-04-30 09:52:29

标签: sql oracle

我们有2个应用程序。一个应用程序使用SQL Server作为后端,另一个应用程序使用Oracle。

在第一个应用程序中,用户可以输入一些信息,第二个应用程序从SQL Server获取数据并将其插入到oracle中。

问题在于用户可以以任何语言输入下表显示了示例数据

SQL Server中的表

enter image description here

例如,用户在地址栏中输入了汉字,长度为10,

Oracle表

enter image description here

此处未插入地址,因为地址长度超过12,在oracle特殊字符中被视为3长度。

我想对字符进行字符串化(使用非英语和英语)。我该如何实现?我写了写特殊字符数的功能。

enter image description here

如何仅从@nstring获得5个角色

2 个答案:

答案 0 :(得分:1)

尝试将Oracle中的列定义为VARCHAR2(10 CHAR)。这将长度语义从字节更改为字符。因此,该列将能够接受10个字符而不仅仅是10个字节,如果字符串中包含特殊字符,这可能会缩短。

答案 1 :(得分:0)

declare @nstring NVARCHAR(MAX)=N'理,551'
declare @lenSQL int = len(@nstring)
declare @oracleLen int = @lenSQL +(2 * [dbo].[CountNonEnglishfromString](@nstring)) 

declare @OracleMaxLen int =  5; -- change as per len required 


declare @newString nvarchar(max);
if(@OracleMaxLen < @oracleLen)
begin 
declare @olen int =0
        declare @count int =1;
            WHILE ( @count <= @lenSQL)
                BEGIN        
                       declare @ch nvarchar(1) =(SELECT SUBSTRING(@nstring,@count,@count) AS ExtractString); 
                       declare @isSpecialChar int = [dbo].[CountNonEnglishfromString](@ch)
                          if(@isSpecialChar = 1)
                              begin  
                                    set @olen = @olen+3;  
                              end   
                          else 
                                begin   
                                       set  @olen = @olen+1;  
                                 end  
                          if(@OracleMaxLen < @olen)
                           begin  
                                break
                            end  
                           set  @newString =CONCAT(@newString , @ch)
                        set @count = @count +1
                End 
End 
else
begin 
 set @newString = @nstring
end 

select isnull(@newString,'') as 'new string';