2016-04-19 12 views
1

私たちはいくつかの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で何かを見つけることができませんでした。

+0

sqlfiddle 5.5も奇妙な結果をもたらします...また、中間の一時変数を使用して解決しました...私はあなたが大きなバグを見つけたと思います –

+1

これはおそらく5.6で修正されたバグでしょう。私はクローズドバグを検索したときにそれを見つけることができませんでしたが、これは類似しています:http://bugs.mysql.com/bug.php?id=60166 – Barmar

答えて

3

これはMySQL 5.6.5で修正されたバグです。 LOWER(SUBSTRING_INDEX(...))に関する多少類似したバグレポートがあります。コメントで閉鎖されました:

5.6.5に変更ログ。

をLOWER()などの変換関数の引数として使用すると、SUBSTRING_INDEX()の結果に文字が含まれない可能性があります。

私は、根本的な原因がポインタの誤使用でバッファオーバーフローと未定義の動作を引き起こすと考えています。うまくいけば、私はサーバー内の長命のメモリを壊さなかったでしょう。

+0

nice find、別の順序で呼び出すことによって提案された修正が動作しますあなたの例でも同様に –

+0

素晴らしい.. upvote。見て、私はあなたの考え[私の質問の下にある唯一の答え]を知りたい(http://stackoverflow.com/questions/39358749/how-can-i-use-aliases-on-group-by-clause# 39359000)。あなたはそれを見てみることができますか?それは大丈夫ですか?もっと良いことができますか?それともいいじゃない?または等。 – stack

関連する問題