MySQL:IFNULLは異なるコレクションと友達ではありませんか?!

今日、パラメーターのエンコード(文字セット)と比較(照合)が異なる場合、IFNULLの奇妙な機能を発見しました。



そこで、少しテストを行います。

CREATE TABLE `test` ( `name1` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL , `name2` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci ROW_FORMAT=DYNAMIC;
      
      





リクエストを送信する

 SELECT IFNULL(name1, name2) FROM test;
      
      





それに応じて:

 Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation 'ifnull'
      
      





一見、すべてが論理的です-比較は異なり、エラーが返されますが、考えてみると、IFNULLステートメントは比較にまったく注意を払うべきではありません。



最初に頭に浮かんだ問題を回避し始めました

 SELECT IFNULL(name1 COLLATE utf8_general_ci, name2) FROM test;
      
      





リクエストはエラーなしで機能しましたが、リクエスト自体の時間に匹敵する5〜10ミリ秒の1つのフィールドの単純な選択と比較して長いです(6〜8ミリ秒、私の場合はダース結合です)。 なぜなら ベースの負荷が大きく、主な要求であるため、解決策は私には向いていませんでした。



さらに考えます。 「通常のIFを試すとどうなりますか? いいえ、明らかにそれは動作しません...どうしたら? あまり時間を無駄にしません。「

 SELECT IF(name1 IS NOT NULL, name1, name2) FROM test;
      
      





リクエストが機能したときの驚きは何でしたか。

「どうしたらいいの。 私はおそらくどこかで間違えているでしょう...私たちはすべてが本当に機能していることを再確認しますが、おそらくもっと長くなります。

「いいえ、要求時間は1ミリ秒変更されました。これはエラーレベルo_0です」



もう一つの奇妙なこと

 ALTER TABLE `test` MODIFY COLUMN `name2` varchar(10) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL AFTER `name1`;
      
      





リクエストを送信する

 SELECT IFNULL(name1, name2) FROM test;
      
      





うまくいきましたか? 0_oここでは、間違いを見ることを期待していますが、間違いはありません!」



この動作に関するマニュアルには、何も見つかりませんでした。 バグまたは機能とは何ですか?



PSバージョン5.0および5.1でチェック済み。



All Articles