MySQL時間設定の注意事項の深くまとめ


時間は本当にありますか?時間は人間の構想の一つの概念であり、物事の変化を測る基準であるという見方があります。データベースにとって時間はデータとともに進みます。MySQL時間の渦の中に入ってみます。
1.時間の種類のフィールド
MySQL時間タイプフィールド:

以下の見落としやすい内容:
TIMESTAMP保存データ方式:
MySQLは、TIMESTAMP値を現在のタイムゾーンからUTCに変換して記憶し、UTCから現在のタイムゾーンに戻して検索します。
(これはDATETIMEのような他のタイプには適用されません。)デフォルトでは、各接続の現在のタイムゾーンはサーバの時間です。タイムゾーンは接続ごとに設定できます。タイムゾーン設定が変わらない限り、格納されている同じ値に戻ります。タイムスタンプの値を記憶して、タイムゾーンを変更してその値を検索すると、検索した値は記憶している値とは異なります。この場合は、同じタイミング領域を両方の方向に使用して変換しないためである。現在のタイムゾーンはタイムゾーンとして使えます。zoneシステム変数の値。

TIMESTAMPとSQL_MODEユニット
sqlmodeもtimestamp値に影響します。

mysql> CREATE TABLE ts (
         id INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY,
         col TIMESTAMP NOT NULL
     ) AUTO_INCREMENT = 1;

mysql> SHOW VARIABLES LIKE  '%sql_mode%';
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| sql_mode      | STRICT_TRANS_TABLES |
+---------------+---------------------+
mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10');
ERROR 1292 (22007): Incorrect datetime value: '1969-01-01 01:01:10' for column 'col' at row 1

mysql> SET sql_mode="";
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW VARIABLES LIKE  '%sql_mode%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sql_mode      |       |
+---------------+-------+
mysql>  INSERT INTO ts (col) VALUES ('1969-01-01 01:01:10'),('2999-01-01 01:01:10');
Query OK, 2 rows affected, 2 warnings (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 2
mysql> show warnings;
+---------+------+----------------------------------------------+
| Level   | Code | Message                                      |
+---------+------+----------------------------------------------+
| Warning | 1264 | Out of range value for column 'col' at row 1 |
| Warning | 1264 | Out of range value for column 'col' at row 2 |
+---------+------+----------------------------------------------+

mysql> SELECT * FROM TS;
+----+---------------------+
| id | col                 |
+----+---------------------+
|  1 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 |
+----+---------------------+
2 rows in set (0.00 sec)

コントロールでmodeは、timestampの制限値を超えて挿入しましたが、0の空きを埋める方式を採用しています。
STRICTに対してTRANS_TABLES、MySQLは無効な値を一番近い有効値に変換し、調整された値を挿入します。値が足りない場合、MySQLは列データタイプに暗黙的なデフォルト値を挿入します。
2.explicit_defaults_for_timestamp時間処理メカニズム

デフォルトは有効です。
MySQL 8.0.22では、TIMESTAMP NOT NULLと宣言した列にNULLを挿入しようとしたら拒否され、エラーが発生します。
1.explicit_defaults_for_タイムスタンプが無効になった時:
  • NULL属性明示的宣言を使用していないタイムスタンプ列は、NOT NULL属性宣言を自動的に使用する。このような列の割り当て値をNULLとして許可し、列を現在のタイムスタンプに設定します。MySQL 8.0.22では、TIMESTAMP NOT NULLと宣言した列にNULLを挿入しようとしたら拒否され、エラーが発生します。
  • テーブルの第一列にNULL属性または明示的なDEFAULTまたはON UPDATE属性が宣言されていない場合、自動的にデフォルトのCURRENT__が使用されます。TIMESTAMP属性とON UPDATE CURRENT_TIMESTAMP属性を宣言します。
  • TIMESTAMPがNULL属性または明示的なデフォルト属性宣言を明示的に使用していない場合、自動宣言はデフォルトの「0000-00-00:00」(「ゼロ」タイムスタンプ)
  • である。
  • 起動されているのはstrict SQLモードですか?それともNO_ですか?ゼロガスDATE SQLモードでは、デフォルト値「0000-00-00:00」が無効になります。
  • 2.explicit_defaults_for_タイムスタンプが有効になりました
  • は、TIMESTAMPにNULL値を指定して、現在のタイムスタンプに設定することができない。現在のタイムスタンプを指定してCURRENT_に設定します。TIMESTAMPまたは類義語、例えばNOW()。
  • not NULL属性明示的宣言を使用していないTIMESTAMP列は、NULL属性宣言を自動的に使用し、空の値を許可する。
  • NOT NULL属性宣言を使用したタイムスタンプ列は、空の値を許さない。このような列のためにNULLを挿入する場合、strict SQLモードが有効になると、一方の行の挿入にエラーが発生したり、strict SQLモードを無効にした複数の行の挿入は'0000-00-00:00'に挿入されます。いずれの場合も、列の割り当て値NULLは現在のタイムスタンプに設定されません。
  • は、NOT NULL属性明示的な声明を使用して、明示的なデフォルト属性のないタイムスタンプ列をデフォルト値なしと見なしている。このような列に明示的な値の挿入行が指定されていない場合、結果はSQLモードに依存します。厳格なSQLモードを有効にするとエラーが発生します。厳密なSQLモードが有効にされていない場合は、デフォルトの値'0000-00-00:00'を使用して列を宣言し、警告が表示されます。
  • timestampタイプフィールドは、デフォルトのCURRENT__を自動的に使用しません。TIMESTAMP属性またはCURRENT_を更新します。TIMESTAMP属性宣言。これらの属性は明示的に指定しなければなりません。

  • テスト:
    
    CREATE TABLE `test1`(
    id bigint not null AUTO_INCREMENT COMMENT '  ID', 
    name varchar(20) COMMENT '  ID',
    create_time TIMESTAMP  NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'cr time',
    PRIMARY KEY(id)
    )ENGINE=InnoDB  AUTO_INCREMENT=1 ;
    SHOW VARIABLES LIKE 'explicit_defaults_for_timestamp';
    SET  GLOBAL  explicit_defaults_for_timestamp=ON;
    SET  GLOBAL  explicit_defaults_for_timestamp=OFF;
    INSERT INTO test1(id,name,create_time) VALUES(1,'Kit',NULL);
    
    3.mysqlシステム配置
    システム関連イベントのパラメータは3つあります。
    
    mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%';
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | system_time_zone | CST    |
    | time_zone        | SYSTEM |
    | log_timestamps   | UTC    |
    +------------------+--------+
    3 rows in set (0.00 sec)
    
    1.system time zone:サーバーが起動すると、自動的にホストのタイムゾーンを確認してみて、system(u)を設定するために使用します。time_zoneシステム変数。その後、この値は変わりません。
    2.time_zone:全time_zoneはサーバが現在動作しているタイムゾーンを表します。初期のtime me_zone値は「SYSTEM」で、サーバータイムゾーンがシステムタイムゾーンと一致することを表します。
  • SYSTEMに設定すると、MySQL関数コールのようなシステムライブラリが起動して、現在のシステムタイムゾーンを決定します。この呼び出しは大域的に連動して保護され、競合の原因となります。CPUの使用率が高い問題。
  • セッションタイムゾーンを設定すると、タイムゾーンの敏感な時間値の表示と記憶に影響を与えます。これは、NOW()やCURTIME()などの関数が表示する値と、タイムスタンプ列に格納されている値とタイムスタンプ列から検索された値を含む。タイムスタンプ列の値は、セッションタイムゾーンからUTCに変換して記憶し、UTCからセッションタイムゾーンに変換して検索します。
  • セッションタイムゾーン設定はUTC_に影響しません。TIMESTAMP()などの関数が表示する値は、DATE、time、DATETIME列の値にも影響しません。これらのデータタイプの値はUTCにも記憶されていない。タイムゾーンはタイムスタンプの値から変換する時にのみ適用されます。
  • 備考:mysqlはまた、タイムゾーンをmysqlシステムライブラリに導入する方法を提供します。mysqlを通してtzinfoto_sqlプログラムロード/usr/share/zoneinfom下のタイムゾーン情報。
    
    mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
    +----------+
    | COUNT(*) |
    +----------+
    |        0 |
    +----------+
    
    奅Ümysqltzinfoto_sqlツール導入時の値
    
    shell>mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
    
    
    mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
    +----------+
    | COUNT(*) |
    +----------+
    |     1780 |
    +----------+
    
    3.ロゴ_timestamps
    この変数は、エラーログに書き込むメッセージと、ファイルに書き込む一般的なクエリログと、ログメッセージのタイムスタンプのタイムゾーンを制御します。
    これは一般的な検索ログのタイムゾーンと遅い検索ログメッセージの書き込みには影響しません。general.log mysql.slow_ロゴ
    許可されたロゴtimestamps値はUTC(標準値)とSYSTEM(ローカルシステムタイムゾーン)です。
    備考:UTCとは、世界を協調させる場合をいう。世界を調整する時、世界統一時間、世界標準時間、国際協調時間とも言われます。UTC+8時間=中国時間です。
    もちろん値はシステム記録時間と一致してこそ、より良い管理が可能です。
    
    #    ,      
    SET GLOBAL time_zone = '+8:00';   
    

    提案:
    mysqlプロファイルmy.cnf
    
    [mysqld]
    log_timestamps=SYSTEM
    default-time_zone                  = '+8:00'
    
    
    mysql>show global variables where Variable_name like '%time_zone%' or Variable_name like 'log_timestamp%';
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | log_timestamps   | SYSTEM |
    | system_time_zone | CST    |
    | time_zone        | +08:00 |
    +------------------+--------+
    
    締め括りをつける
    時間のタイプ、パラメータ、システムタイムゾーンから、MySQLの時間はどのように設定して使うべきかが分かりました。
    特に特別な要求はありません。modeは簡単に変えないでください。
    ここで、MySQLの時間設定の注意事項についての記事を紹介します。MySQLに関する詳細な設定については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。