演算子が異なる型のオペランドと共に使用される場合、オペランドを適合化するため、型変換が起こります。変換のあるものは、暗黙的に発生します。たとえば 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
浮動小数点の比較についての詳細は、Problems with Floating-Point Values をご覧ください。