2017-01-23 11 views
0

私は従来のPHPシステムをサポートしています。彼らはデータベースサーバーの移動を計画しています。我々は現在MariaDB 10.1上にあり、新しいサーバもMariaDB 10.1です。私は数百(または多分数千)のようなクエリを持っています:Maria DB 10.1 DATETIMEブランク値

UPDATE ontime_assets 
SET AssetName = '117 J19', PlateDate = '20161224', InspectionDate = '' 
WHERE AssetID = 7; 

これはうまく処理されます。私はこのエラーを取得し、新しいものに:

Error updating record: Incorrect datetime value: '' for column 'InspectionDate' at row 1.

彼らは、データベースが移行されたことを私に伝え、構造的に同一であるが、明らかにそうではありません。 InspectionDateは必須ではなく、NULL値を受け入れるように設定されているDATETIMEです。

良いコードであるかどうかにかかわらず、空の文字列を取り出すコードの書き換えは実行できません。誰でもMariaDBが設定していることを考えている人はいますか?それはこのクエリが現在動作することを許可しますが、新しいサーバでは別に設定されますか?

答えて

0

Does anyone have any idea what MariaDB setting it is that would allow this query to work currently but would be set differently on the new server?

InspectionDate列は空の文字列を割り当てるdatetime、である場合には、単に許可されていません。ほとんどの場合、InspectionDateがテキスト列だったため、クエリは以前に実行されていました。これは、データベースにある日付機能を利用できないため、魅力的ではありません。

だけではなく、空の文字列を代入するプレースホルダーとしてInspectionDate列にNULLを割り当てる:あなたはスクリプトを更新するヘルプが必要な場合

UPDATE ontime_assets 
SET AssetName = '117 J19', 
    PlateDate = '20161224', 
    InspectionDate = NULL 
WHERE AssetID = 7 

が、多分ここで誰かがあなたの選択InspectionDate = NULLInspectionDate = ''を交換する正規表現を与えることができます。

+0

フィードバックに感謝します。 sqlはPHPを介して生成され、時にはそこに日付があり、時にはそれが空白であるため、文字列置換よりもずっと多くのコードがあります。しかし、現在の生産システムでは積極的に働いてスカウト栄誉を得ており、両方のフィールドは日時、まったく同じ構造です。 –

+0

私はこれを疑う。 AFAIKでは、空の文字列を 'datetime'カラムに挿入することはできません。これらの元のクエリをチェックして、実際に何が起きているのかを確認する必要があります。 –

+0

こんにちはTim。あなたのポイントを確認していない、私はここにログインしていないと、これは本当に起こっている。ありがとう! –

1

[OK]私は一晩中起きていましたが、私はそれを理解しました!

etc/my.cnfファイルに設定されているSQL_MODEという設定があります。また、usr/my.cnfファイルの以前のバージョンからDBをアップグレードした場合(これはあまりにも不満ですが、見つけた!)。

クエリを実行すると、sql_mode設定を見つけることができます。SELECT @@ sql_mode;

OLD DBにはSTRICT_TRANS_TABLESが設定されていませんでした。したがって、NEW DBはそれを行いました。したがって、古いものではなく空の文字列日付のエラーが発生しました。私はSTRICT_TRANS_TABLESをusrやその他のmy.cnfファイルから取り出して、mysqlサーバプロセスをリサイクルさせました。低速で、古いボックスのように動作します。

+0

あなたがエラーを無視しているからといって、エラーがまだそこにないわけではありません。しかし、良い探偵仕事。 –

関連する問題