唯一の方法は、ストアド プロシージャを記述することだったようです。やった。左の列(castbin
)は処理前のテキスト、右の列( )は処理converted
後の同じテキスト
コードを見てみましょう
...
#above and below are regular MySQL statements
@castbin:=cast(networks.description as char character set binary) as castbin,
@convv:=convert(repcxaxex(@castbin) using cp866) as converted
...
@castbin
明確化と読みやすさのためにのみ使用される変数。repCxAxEx
「0xCx 0xAx を 0xCx 0xEx に置き換える」という名前の関数によって実行されるすべてのジョブ。これは、この関数の非常に最適ではないが機能するコードです (MySQL Studio から取得)。
See corrected text of the function below in update section
最初に文字列が変換可能かどうかを確認し、次に for と prefix の 2 つの変換を行い0xC2
ます0xC3
。これらのプレフィックスは異なるエンコーディング エラーを意味するためです。
更新: 徹底的なテストにより、いくつかの間違いが見つかりました。
クエリ内のどこかで、group_concat
演算子を使用して、同じ PC の複数のプロパティの値を、区切り文字として "\n" を使用した 1 つの長い文字列にマージします。そのような場合、変換が機能しないことがあります。
-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$
CREATE DEFINER=`root`@`%` FUNCTION `repcxaxex`(s2c text charset binary) RETURNS blob
begin
/*исправляем проблемы с кодировками*/
set @i:=0;
set @s:=s2c;
set @altered:='0';
if ((left(@s,1)=char(0xc2)) or instr(@s,char(32,0xc2)) or instr(@s,char(0x0a,0xc2))) then
while @i<16 do
set @s:=replace(@s,char(0xc3,(160+@i)),char(0xd3,(224+@i)));
set @i:=@i+1;
end while;
set @i:=1;
while @i<4 do
set @s:=replace(@s,char(0xc0+@i),'');
set @s:=replace(@s,char(0xd0+@i),'');
set @i:=@i+1;
end while;
set @altered:='1';
end if;
set @i:=0;
if ((left(@s,1)=char(0xc3)) or instr(@s,char(32,0xc3)) or instr(@s,char(0x0a,0xc3))) then
while @i<16 do
set @s:=replace(@s,char(0xc3,(176+@i)),char(0xd3,(224+@i)));
set @i:=@i+1;
end while;
set @i:=1;
while @i<4 do
set @s:=replace(@s,char(0xc0+@i),'');
set @s:=replace(@s,char(0xd0+@i),'');
set @i:=@i+1;
end while;
set @altered:='2';
end if;
/*Добавляем 0 или 1 в начало строки, чтобы показать, конвертировали ее или нет
выводить надо будет, начиная со второго символа*/
set @s=concat(@altered,@s);
return @s;
end
終了時に、関数は返された文字列の先頭に 1 桁を追加します。数字自体は@altered
変数によって決定され、そのコードは一目瞭然です。
呼び出しのより正しい形式は次のとおりです。
If (left(repcxaxex(string-to-convert),1)='0',string-to-convert,mid(convert(repcxaxex(string-to-convert) using cp866),2))