私たちはいくつかのDebianサーバでMySQL 5.5.47を実行しています。これは、@TKEY
(:
間-
)の中央部分を抽出し、ハイフンですべての期間を交換することになっているSUBSTRING_INDEXのREPLACEを実行するために一時変数を使用する必要があります
mysql> set @TKEY:='ARDARD:fae590c4.ffa2.11e5.a318.0cc47a39aeb4-1460351116';
mysql> select replace(substring_index(substring_index(@TKEY,':',-1),'-',1), '.','-') as guid;
+--------------------------------------+
| guid |
+--------------------------------------+
| fae5a2.1--0cc47a 9ae47a 9aeb4a 9aeb4 |
+--------------------------------------+
:それらのいくつかでは、我々は以下の奇妙な行動を見ています。スペースはどこから来ていますか?結果の他の部分は混乱しているようです:9aeb4
が複製されました。a2.1
は左にシフトされています。
中間変数にsubstring_index
を割り当てると、これは起こりません。
mysql> set @temp = substring_index(substring_index(@TKEY,':',-1),'-',1);
mysql> select replace(@temp, '.', '-') as guid;
+--------------------------------------+
| guid |
+--------------------------------------+
| fae590c4-ffa2-11e5-a318-0cc47a39aeb4 |
+--------------------------------------+
これは、プロダクションサーバーでのみ発生します。開発サーバーやsqlfiddleで再現できません。私はすべてのサーバー変数を比較しましたが、文字列関数の動作に影響を与えるような違いはありません(最初は文字セットと照合変数の違いがありましたが、実動サーバーに合わせてdevサーバーを変更しました。 「はtは私がわずかに異なる誤った結果を得るのMySQL 5.5.41実行している別の本番サーバでエラー
を複製:最後3
のの代わりにスペースがありますことを除いて
mysql> select replace(substring_index(substring_index(@TKEY,':',-1),'-',1), '.','-') as guid;
+--------------------------------------+
| guid |
+--------------------------------------+
| fae590c4-ffa2-11e5-a318-0cc47a 9aeb4 |
+--------------------------------------+
これは正しいです。
誰でもこれを説明できますか? MySQLのバグ?私はbugs.mysql.comで何かを見つけることができませんでした。
sqlfiddle 5.5も奇妙な結果をもたらします...また、中間の一時変数を使用して解決しました...私はあなたが大きなバグを見つけたと思います –
これはおそらく5.6で修正されたバグでしょう。私はクローズドバグを検索したときにそれを見つけることができませんでしたが、これは類似しています:http://bugs.mysql.com/bug.php?id=60166 – Barmar