web-dev-qa-db-ja.com

日時形式がmysql5.0と5.1の間で変更されましたか?

Mysqlスレーブをmysql5.0からmysql5.1にアップグレードしました。キャッチアップ中に、日時値が正しくないクエリでレプリケーションが失敗しました。

110919 13:56:18 [ERROR] Slave SQL: Error 'Incorrect datetime value: '2010-03-14 02:35:34.0' for column 'creation_date' at row 1' on query.

クエリを再挿入しようとしましたが、再度失敗し、値を次のように修正しました。

2010-03-14 02:35:34

クエリが受け入れられました。

将来の問題を防ぐために、そのような日時値を承認するようにmysqlを設定するにはどうすればよいですか?

私の推測では、それはテーブルの説明で設定され、mysql_upgrade中にリセットされたと思います。

5
smintz

Mysql 5.1は、mysql 5.0と同じようにマイクロ秒を操作しますが、マイクロ秒を時間データ型の列に格納することはできません。 Mysql Doc: http://dev.mysql.com/doc/refman/5.1/en/datetime.html に従って、マイクロ秒の部分は破棄されます。ただし、これでエラーが発生するため、mysqlのSQLモード設定を使用して無効な日付を許可することを有効にできます。

sql-mode=allow_invalid_dates

my.cnfまたはmy.ini(OSによって異なります)。

http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates

PS:あなたが質問で提供した日時が実際にはDSTに存在しない時刻であることは驚くべきことです(2010年3月14日):)

6
SparX

My.cnfでdatetime_formatを設定する必要がある場合があります

これが非常に珍しいことです。変数 date_format および datetime_format MySQL 5.xに存在します:

mysql> select version();
+----------------------+
| version()            |
+----------------------+
| 5.0.81-community-log |
+----------------------+
1 row in set (0.00 sec)

mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name   | Value             |
+-----------------+-------------------+
| date_format     | %Y-%m-%d          |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)

MySQLドキュメントでそれらを調べると、未使用であると表示されます。それでも、驚いたことに、セッションでそれらを設定できます。方法は次のとおりです。

mysql> set date_format = '%Y%m%d';
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name   | Value             |
+-----------------+-------------------+
| date_format     | %Y%m%d            |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)

質問:グローバルに設定できますか? (この例はWindowsのMySQL 5.5.12です)

mysql> set global date_format = '%Y%m%d';
ERROR 1238 (HY000): Variable 'date_format' is a read only variable

少なくとも、コマンドラインではできません。 my.cnf(my.ini)ではどうですか?

これをPCのmy.iniに追加しました

[mysqld]
date_format="%Y%m%d"

mysqlを再起動し、これを取得しました:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.12-log |
+------------+
1 row in set (0.00 sec)

mysql> show variables like 'date%format';
+-----------------+-------------------+
| Variable_name   | Value             |
+-----------------+-------------------+
| date_format     | %Y%m%d            |
| datetime_format | %Y-%m-%d %H:%i:%s |
+-----------------+-------------------+
2 rows in set (0.00 sec)

公式には文書化されていませんが、自由にフォーマットを試すことができます。

試してみる !!!

免責事項:あなたの日時データのいずれかがキャッチまたは殺された場合、私はあなたの行動の知識を否認します。

0
RolandoMySQLDBA