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でチェック済み。

Source: https://habr.com/ru/post/J107137/


All Articles