проблема длины данных из SQL Server в Oracle с неанглийским символом - PullRequest
0 голосов
/ 30 апреля 2019

у нас есть 2 приложения. Одно приложение использует SQL Server в качестве бэкэнда, а другое приложение использует Oracle.

В первом приложении пользователь может ввести некоторую информацию, а во втором приложении получить данные из SQL Server и вставить их в Oracle.

Проблема в том, что пользователь может ввести на любом языке, в следующей таблице приведены примеры данных

Таблица в SQL Server

enter image description here

Например, пользователь ввел китайские символы в поле адреса и его длина равна 10,

Таблица Oracle

enter image description here

Адрес не вставляется здесь, потому что длина адреса превышает 12, в специальном символе оракула, считающем длину 3.

Я хочу подстроку символа (не с английским и с английским). Как я могу этого достичь? Я написал функцию, которая написала номер спецсимвола.

enter image description here

как получить только 5 символов из @ nstring

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

Попробуйте определить столбец в Oracle как VARCHAR2(10 CHAR).Это меняет семантику длины с байтов на символы.Таким образом, столбец сможет принимать 10 символов, а не только 10 байтов, что может быть коротким, если в строке есть специальные символы.

0 голосов
/ 30 апреля 2019
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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...