MySQL 5.6.4 より前では、時間値で小数秒部分が許可されているインスタンスは制限されています。後続の小数部は、リテラル値などのコンテキストで許可され、一部の時間関数への引数またはそこからの戻り値で許可されています。例:
mysql> SELECT MICROSECOND('2010-12-10 14:12:09.019473');
+-------------------------------------------+
| MICROSECOND('2010-12-10 14:12:09.019473') |
+-------------------------------------------+
| 19473 |
+-------------------------------------------+
ただし、MySQL は時間データ型のカラムに値を格納するときに、小数部を破棄し、それを格納しません。
MySQL 5.6.4 以降では、マイクロ秒 (6 桁) までの精度を持つ TIME
、DATETIME
、および TIMESTAMP
値に対して小数秒のサポートを拡張しています。
-
小数秒部を含むカラムを定義するには、
の構文を使用します。ここで、type_name
(fsp
)type_name
はTIME
、DATETIME
、またはTIMESTAMP
であり、fsp
は小数秒の精度です。例:CREATE TABLE t1 (t TIME(3), dt DATETIME(6));
fsp
値を指定する場合、0 から 6 の範囲にする必要があります。0 の値は、小数部がないことを表します。省略した場合、デフォルトの精度は 0 です。(これは、以前の MySQL バージョンと互換性を保つため、標準 SQL のデフォルトである 6 とは異なっています。) -
小数秒部分を持つ
TIME
、DATE
、またはTIMESTAMP
値を同じ型のカラムに挿入するが、小数部の桁数が少ない場合、次の例に示すように丸めが行われます。mysql> CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2) ); Query OK, 0 rows affected (0.33 sec) mysql> INSERT INTO fractest VALUES > ('17:51:04.777', '2014-09-08 17:51:04.777', '2014-09-08 17:51:04.777'); Query OK, 1 row affected (0.03 sec) mysql> SELECT * FROM fractest; +-------------+------------------------+------------------------+ | c1 | c2 | c3 | +-------------+------------------------+------------------------+ | 17:51:04.78 | 2014-09-08 17:51:04.78 | 2014-09-08 17:51:04.78 | +-------------+------------------------+------------------------+ 1 row in set (0.00 sec)
このような丸め行われたときに、警告やエラーは表示されません。この動作は、SQL 標準に従い、サーバーの
sql_mode
設定の影響は受けません。 時間引数を取る関数は、小数秒を含む値を受け入れます。時間関数からの戻り値には、必要に応じて小数秒が含まれます。たとえば、引数を付けない
NOW()
は、小数部のない現在の日付と時間を返しますが、0 から 6 のオプション引数を取って、その桁数の小数秒部が戻り値に含まれていることを指定します。時間リテラルの構文は、
DATE '
、str
'TIME '
、およびstr
'TIMESTAMP '
の時間値と ODBC 構文同等の値を生み出します。指定されている場合、結果の値には後続の小数秒部分が含まれます。以前は、時間型キーワードは無視され、これらの構造は文字列値を生成していました。標準 SQL と ODBC の日付および時間リテラルを参照してください。str
'
場合によっては、以前に受け入れられていた構文が別の結果を生成することがあります。次の項目は、問題を回避するために既存のコードのどの箇所を変更する必要があるかを示します。
式の中には、以前の結果とは異なる結果を生成するものがあります。例:
timestamp
システム変数は、整数ではなくマイクロ秒小数部を含む値を返します。現在の時間を含む結果を返す関数 (CURTIME()
、SYSDATE()
、UTC_TIMESTAMP()
など) は、fsp
値として引数を解釈し、戻り値にはその桁の小数秒部分が含まれます。以前には、これらの関数は引数を許可していましたが、無視していました。TIME
値は、現在の日付に時間を追加することによりDATETIME
に変換されます。(これは、時間値が'00:00:00'
から'23:59:59'
の範囲から外れている場合に、結果の日付部分が現在の日付と異なることを意味します。)以前には、TIME
値のDATETIME
への変換は信頼性がありませんでした。セクション11.3.7「日付と時間型間での変換」を参照してください。TIMESTAMP(
は古い MySQL バージョンで許可されていましたが、N
)N
は小数秒精度ではなく表示幅でした。この動作のサポートは MySQL 5.5.3 で廃止されたので、適度に最新の状態に維持されているアプリケーションであれば、この問題の影響を受けません。それ以外の場合では、コードを書き換える必要があります。