web-dev-qa-db-ja.com

mysql datetime DEFAULT CURRENT_TIMESTAMPエラー

1。このMYSQL構文をWindowsで実行すると、正常に実行されました。

CREATE TABLE New
(
id bigint NOT NULL AUTO_INCREMENT,
timeUp datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (id)
)

しかし、Linuxでこのコードを実行しようとするとエラーが発生しました

 #1067 - Invalid default value for 'time'

2。 Windowsでは、大文字と小文字は区別されません。新規と新規の両方は同じと見なされます。しかし、Linuxでは大文字と小文字が区別されます。

Linuxの構成

MySQL 5.5.33、phpMyAdmin 4.0.5およびPHP 5.2.17

Windowsの構成

MySql:5.6.11、phpMyAdmin 4.0.4.1 PHP:5.5.0

両方のシステムで共通にする方法はありますか。または、代替アプローチ。読んでくれてありがとう。

12
Johny Pie

DEFAULT CURRENT_TIMESTAMPのサポートがDATETIME(データ型)がMySQL 5.6に追加されました。

5.5以前のバージョンでは、これはTIMESTAMP(データ型)列にのみ適用されました。

5.5でBEFORE INSERTトリガーを使用して、列にデフォルト値を割り当てることができます。

 DELIMITER $$

 CREATE TRIGGER ...
 BEFORE INSERT ON mytable
 FOR EACH ROW
 BEGIN
    IF NEW.mycol IS NULL THEN
       SET NEW.mycol = NOW();
    END IF;
 END$$

(列に格納された値に対するクエリの)大文字と小文字の区別は、列にcollationが使用されているためです。 _ciで終わる照合は、大文字と小文字を区別しません。たとえば、latin1_swedish_ciは大文字と小文字を区別しませんが、latin1_general_csは大文字と小文字を区別します。

SHOW CREATE TABLE fooからの出力は、文字タイプ列の文字セットと照合順序を示します。これは、列ごとのレベルで指定されます。テーブルレベルで指定された「デフォルト」は、新しい列定義で文字セットが指定されていない場合、テーブルに追加された新しい列に適用されます。

[〜#〜] update [〜#〜]

Kaiiは、「大文字と小文字の区別」に関する私の答えは列に格納された値を扱い、クエリが"New"の値を含む列から値を返すかどうかは"t.col = 'new'"のような述語で返されると指摘しました。

identifiers(例:テーブル名)に関するKaiiの回答を参照してください。Windowsでは、Linuxとは異なる方法で(デフォルトで)処理されます。

32
spencer7593

_DEFAULT CURRENT_TIMESTAMP_の質問はすでに回答されているため、WindowsとLinuxの間のテーブル名の大文字と小文字の区別の不一致にのみ応答します。

Windowsでは、ファイルシステムはデフォルトで大文字と小文字を区別しません。
ただし、Linuxおよびその他のオペレーティングシステムなどの* NIXでは、デフォルトで大文字と小文字が区別されます。

ここで振る舞いが一致しない理由は、各テーブルが個別のファイルとして作成され、ファイルシステムが大文字と小文字を区別するため、ファイルシステムにあります。

MySQLには、この動作をオーバーライドするパラメーターがあります。

たとえば、Unixでは、_my_table_および_MY_TABLE_という2つの異なるテーブルを使用できますが、Windowsでは、これら2つの名前は同一と見なされます。データベース名またはテーブル名の大文字小文字に起因するデータ転送の問題を回避するには、2つのオプションがあります。

  • すべてのシステムで_lower_case_table_names=1_を使用します。これの主な欠点は、_SHOW TABLES_または_SHOW DATABASES_を使用すると、元の大文字小文字に名前が表示されないことです。

  • Unixでは_lower_case_table_names=0_を、Windowsでは_lower_case_table_names=2_を使用します。これにより、データベース名とテーブル名の大文字と小文字が保持されます。これの欠点は、Windowsでステートメントが常に大文字と小文字の正しいデータベース名とテーブル名を参照するようにする必要があることです。大文字と小文字が区別されるUnixにステートメントを転送する場合、大文字と小文字が正しくないと機能しません。

    Exception: InnoDBテーブルを使用していて、これらのデータ転送の問題を回避しようとしている場合は、設定する必要がありますすべてのプラットフォームで_lower_case_table_names=1_を使用して、名前を強制的に小文字に変換します。

[...]
このような違いに起因する問題を回避するために、小文字の名前を使用してデータベースとテーブルを常に作成および参照するなど、一貫した規則を採用することが最善です。この規則は、最大限の移植性と使いやすさのためにお勧めします。

これは 識別子の大文字と小文字の区別に関するMySQLマニュアル からの抜粋です

3
Kaii

デフォルトの時間をデータ型でtimestampに変更する必要がある場合は、

datetimeはテーブルのユーザー入力を表示します...

http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html

http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html

1
jmail