演算子が別の型のオペランドとともに使用されると,オペランドの互換性を保ために型変換が発生します。一部の変換は暗黙的に発生します。たとえば,MySQLでは必要に応じて数字が文字列(またはその逆)に自動的に変換されます。
mysql> SELECT 1+'1';- mysql> SELECT CONCAT(2,' test');-> '2 test'
また,把()
関数を明示的に使用して,数字を文字列に変換することもできます。CONCAT ()
関数では文字列の引数が要求されるため,使用すると暗黙的に変換が発生します。
mysql> SELECT 38.8, CAST(38.8 AS CHAR)mysql> SELECT 38.8, CONCAT(38.8);-> 38.8, '38.8'
文字セットの数字から文字列への暗黙的な変換にいて,および创建表…选择
ステ、トメントに適用される変更済みのル、ルに、いては、このセクションの後半を参照してください。
次のル、ルでは、比較演算の際にどのように変換が発生するのかに、いて説明します。
零
安全的< = >
等価比較演算子の場合を除いて,一方または両方の引数が零
の場合は,比較の結果も零
になります。Null <=> Null
の場合は,結果が真になります。変換は必要ありません。比較演算の両方の引数が文字列の場合は,文字列として比較されます。
両方の引数が整数の場合は,整数として比較されます。
16進値が数字と比較されない場合は,バescナリ文字列として処理されます。
引数の一方が
时间戳
またはDATETIME
カラムで他方が定数の場合は,比較が実行される前に定数がタ。これは,odbcにより適合させるために実行されます。これは,在()
への引数には実行されません。念のため,比較を行う際は,常に完全な日付時間,日付,または時間文字列を使用してくださいたとえば,日付または時間の値とともに之间的
を使用したときの結果を最適にするには,把()
を使用して,明示的に値を目的のデ,タ型に変換します。テ,ブル(複数可)からの単一行のサブクエリ,は,定数とみなされません。たとえば,サブクエリ,で
DATETIME
値と比較される整数が返される場合は,比較が2の整数として実行されます。整数は時間値には変換されません。オペランドをDATETIME
値として比較するには,把()
を使用して,明示的にサブクエリ,の値をDATETIME
に変換します。引数のいずれかが10進値の場合,比較はその他の引数に依存します。その他の引数が10進値または整数値の場合,引数は10進値として比較され,その他の引数が浮動小数点値の場合,引数は浮動小数点値として比較されます。
ほかのすべてのケ,スでは,引数は浮動小数点(実)数として比較されます。
別の時間型への値の変換にいては,セクション11.3.7“日付と時間型間での変換”を参照してください。
次の例は,比較演算での文字列から数字への変換を示しています。
mysql> SELECT 1 > '6x';-> 0 mysql> SELECT 7 > '6x';SELECT 0 > 'x6';- mysql> SELECT 0 = 'x6';- > 1
文字列カラムと数字との比較では,MySQLはカラム上のインデックスを使用して,値をすばやく検索できません。str_col
がインデックスの付いた文字列カラムである場合は,次のステートメントで検索を実行するときに,そのインデックスを使用できません。
Select * fromtbl_name在哪里str_col= 1;
その理由は,' 1 '
、' 1 '
、“1”
のように,値1
に変換できるさまざまな文字列があるためです。
このような数字は不正確であるため,浮動小数点数(または浮動小数点数に変換される値)を使用する比較は概算になります。これにより,整合性のない結果が表示される可能性があります。
mysql> SELECT '18015376320243458' = 18015376320243458;-> 1 mysql> SELECT '18015376320243459' = 18015376320243459;- > 0
现年53岁的このような結果はビットの精度しか持たない浮動小数点数に値が変換され,丸めの対象になるために発生する可能性があります。
mysql> SELECT '18015376320243459'+0.0;- > 1.8015376320243 e + 16
さらに,文字列から浮動小数点への変換および整数から浮動小数点への変換は,必ずしも同様に発生するとはかぎりません。整数は,cpuによって浮動小数点に変換される可能性があります。一方、文字列は、浮動小数点の乗算を伴う演算で1桁ず変換されます。
表示される結果はシステムによって異なり,コンピュータのアーキテクチャーやコンパイラのバージョンなどの要因,または最適化レベルの影響を受ける可能性があります。このような問題を回避する方法の1は,値が暗黙的に浮動小数点値に変換されないように,把()
を使用することです。
mysql> SELECT CAST('18015376320243459' AS UNSIGNED) = 18015376320243459;- > 1
浮動小数点の比較にいての詳細は,セクションb.5.5.8“浮動小数点値に関する問題”を参照してください。
MySQL 5.6では,サ,バ,に时差
が含まれています。これは,文字列または小数
値と近似値(浮动
/双
)の数値間の変換を改善するための基礎を提供する変換ラleiブラリです。
UnixとWindows間の変換の相違などが除去された,プラットフォーム間で整合性のある変換結果。
以前の結果に十分な精度がなかった場合(ieeeの制限に近い値など)の正確な値の表示。
最大限の精度を持文字列書式への数字の変換。
时差
の精度は,常に標準のcラaaplブラリ関数の精度と同じか,それ以上です。
このラ电子邮箱ブラリで生成された変換は,时差
以外の結果とは異なる場合があるため,以前の結果に依存するアプリケーションとの互換性が保たれない可能性があります。たとえば,以前の変換からの特定の正確な結果に依存するアプリケーションでは,追加の精度に対応するように調整が必要となる場合があります。
时差
ラ@ @ブラリでは,次のプロパティ@ @を使用した変換が提供されます。D
は小数
または文字列表現を含む値を表し,F
はネ▪▪ティブバ▪▪ナリ(ieee)書式の浮動小数点数を表します。
F
->D
の変換は,最大限の精度で実行され,読み取り時にF
が生成されるもっとも短い文字列としてD
が返され,ieeeで指定されているネaaplティブバaaplナリ形式でもっとも近い値に丸められます。D
->F
の変換は,F
が入力された10進文字列D
にもっとも近いネ▪▪ティブバ▪▪ナリの数字になるように実行されます。
F
が负
、+正
,または南
の場合を除いて,これらのプロパティ,は,F
->D
->F
の変換が可逆であることを暗黙的に示しています。後者の値は,sql標準では浮动
または双
の無効な値として定義されているため,サポ,トされていません。
D
->F
->D
の変換では,D
が15桁以下の精度を使用し,非正規値(负
、+正
,または南
)でないことが可逆のための十分な条件となります。D
の精度が15桁よりも大きい場合でも,変換が可逆であるケースもありますが,常に該当するとはかぎりません。
MySQL 5.6では,暗黙的に数値または時間値を文字列に変換すると,character_set_connection
およびcollation_connection
システム変数で決定された文字セットおよび照合順序を含む値が生成されます。(一般に,これらの変数は组名称
を使用して設定されます。接続文字セットにいては,セクション10.1.4“接続文字セットおよび照合順序”を参照してください。)
まり,接続文字セットが二进制
に設定されている場合を除いて,このような変換では,(非バaapl .ナリ)文字列(字符
、VARCHAR
,または量变
値)が生成されます。この場合,変換の結果はバ电子邮件ナリ文字列(二进制
、VARBINARY
,またはLONGBLOB
値)になります。
整数式では,式の評価に関する上記の備考は,式の割り当てには多少異なる方法で適用されます。次のようなステ,トメントでの例を示します。
创建表integer_expr;
この場合,式の結果として生成されるカラム内のテ,ブルの型は,整数式の長さに応じて,INT
または长整型数字
になります。式の最大長がINT
に収まらない場合は,代わりに长整型数字
が使用されます。長さは,选择
結果セットメタデ,タのmax_length
値から取得されます(セクション23.7.5“c APIデタ構造”を参照してください)。まり,十分に長い式を使用することで,INT
ではなく,长整型数字
を強制的に適用できます。
创建表SELECT 000000000000000000000