演算子が異なるタイプのオペランドと共に使用される場合、オペランドを適合化するため、タイプ変換が起こります。変換のあるものは、暗黙的に発生します。例えば MySQL は、必要に応じて数字を自動的にストリングに変換、またはその逆を行います。
mysql>SELECT 1+'1';
-> 2 mysql>SELECT CONCAT(2,' test');
-> '2 test'
また、明示的な変換を行うことも可能です。数字を明示的にストリングに変換したい場合は、CAST()
または CONCAT()
関数を使用してください ( CAST()
を推奨 ) :
mysql>SELECT 38.8, CAST(38.8 AS CHAR);
-> 38.8, '38.8' mysql>SELECT 38.8, CONCAT(38.8);
-> 38.8, '38.8'
次のルールは、比較の演算に対してどのように変換が行われるかを示しています :
一方か両方の引数が NULL
の場合、比較の結果は、NULL
-safe
<=>
等値比較演算子以外は、NULL
になります。NULL <=> NULL
の場合、結果は true です。
比較の演算の両方の引数がストリングの場合、それらはストリングとして比較されます。
両方の引数が整数の場合、それらは整数として比較されます。
16 進値が数字として比較されない場合は、バイナリ ストリングとして扱われます。
引数の一方が TIMESTAMP
または
DATETIME
カラムで、他の引数が定数の場合、定数は比較が行われる前に、タイムスタンプに変換されます。これは、ODBC
により適合させるためです。これは
IN()
への引数には適用されませんのでご注意ください! 念のため、比較の際は常に完全な日付時刻、日付、または時刻ストリングを使用してください。
他のすべてのケースでは、引数は浮動少数点 ( 実 ) 数として比較されます。
次の例は、比較の演算の、ストリングから数字への変換を表したものです :
mysql>SELECT 1 > '6x';
-> 0 mysql>SELECT 7 > '6x';
-> 1 mysql>SELECT 0 > 'x6';
-> 0 mysql>SELECT 0 = 'x6';
-> 1
ストリング カラムを数字と比較する際、MySQL
は、カラムのインデックスを使用して値を迅速に検索することができませんので注意してください。str_col
がインデックスの付いたストリング
カラムである場合は、そのインデックスを、次のステートメントで検索を行う時に使用することはできません
:
SELECT * FROMtbl_name
WHEREstr_col
=1;
その理由は、'1'
、' 1'
、または
'1a'
のように、値
1
に変換されうるストリングが数多くあるためです。
浮動小数点数 ( または浮動小数点数に変換される値 ) を使用する比較は、それらの数字は不正確であるため、概算になります。そのため、一貫性のない結果が導き出される場合があります :
mysql>SELECT '18015376320243458' = 18015376320243458;
-> 1 mysql>SELECT '18015376320243459' = 18015376320243459;
-> 0
そのような結果が発生しうるのは、53 ビットの精度しか持たない浮動小数点巣に値が変換され、丸めの対象になるためです :
mysql> SELECT '18015376320243459'+0.0;
-> 1.8015376320243e+16
そのうえ、ストリングから浮動小数点への変換と、整数から浮動小数点への変換は、同様に起こらない場合もあります。整数は CPU によって浮動小数点に変換される可能性があり、対してストリングは、浮動小数点の掛け算を含む比較中の数字によって変換された数字であるためです。
表記されている結果はシステムによって異なり、コンピュータ
アーキテクチャやコンパイラのバージョン、または最適化のレベルなどの要素に影響される場合もあります。それらの問題を避ける方法のひとつとして、CAST()
を使用すると、値が暗黙的に浮動小数点数に変換されなくなります
:
mysql> SELECT CAST('18015376320243459' AS UNSIGNED) = 18015376320243459;
-> 1
浮動小数点の比較についての詳細は、項B.1.5.8. 「Problems with Floating-Point Comparisons」 をご覧ください。