3

現時点では Linux 実稼働サーバーにのみデプロイされている既存のアプリケーションに変更を加えるよう依頼されました。私は先に進み、アプリの大部分をローカルの Windows PC で動作させました。MySQLローカル PC にインストールされたプロダクションからの DB の完全なコピーがあります。本番 DB はMySQL v5.0.95Linux 上にあり、私のローカル DB はMySQL v5.5Windows 上にあります。どちらも InnoDB モードです。

私の問題は、次のようなステートメントです。助けたいと思っている他の人が使いやすいように一般化されています。

update atable 
set adate=DATE_ADD(str_to_date('','%m/%d/%Y'), INTERVAL 0 DAY)
where anum='1'

場合によっては、空の文字列が渡され、本番環境では問題が発生せず、レコードを保存/更新できますが、ローカルではSQLException. SQLそのため、ローカル DB に対してステートメントを直接試してみましたが、どちらの場合も次のエラー メッセージが表示されます。

エラー コード: 1411。日時の値が正しくありません: 関数 str_to_date の ''

プロダクションmy.cnfとローカルmy.iniを調べて大きな違いを探しました。また、ローカルで SQL モード " ALLOW_INVALID_DATES" を使用しようとしましたが、最終結果は変わりませんでした。

これらの空の文字列を渡さないようにコードを変更できることはわかっていますが、このようなステートメントはたくさんあります。現時点では、可能であればこれらすべてを変更したくありません。この顧客の予算と時間枠は限られており、私は彼らの新しい要件に集中したいと考えています。可能であれば、本番環境と同じようにローカル環境を機能させる方法についての情報を探しています。

御時間ありがとうございます。

4

3 に答える 3

8

これSQLExceptionは MySQL から直接発生するものではなく、おそらくクライアント言語によってトリガーされます。MySQL は、通常は無視できる警告を生成するだけです。いずれにせよ、ALLOW_INVALID_DATESSQL モード実際にトリックを実行する必要があります。

警告:

mysql> SET @@SESSION.sql_mode='NO_ZERO_DATE,NO_ZERO_IN_DATE';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y'));
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+-------------------------------------------------------+
| Level   | Code | Message                                               |
+---------+------+-------------------------------------------------------+
| Warning | 1411 | Incorrect datetime value: '' for function str_to_date |
+---------+------+-------------------------------------------------------+
1 row in set (0.00 sec)

警告なし:

mysql> SET @@SESSION.sql_mode='ALLOW_INVALID_DATES';
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test (date_created) VALUES (str_to_date('','%m/%d/%Y'));
Query OK, 1 row affected (0.03 sec)

編集:クエリを書き直す方法を探している場合は、次のようなものを試すことができます。

update atable 
set adate=NULL
where anum='1'

もちろん、これにadateは nullable が必要です。

于 2013-02-19T16:20:06.580 に答える