Error in mysql when setting default value for DATE or DATETIME
I'm running MySql Server 5.7.11 and this sentence:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
is not working. Giving the error:
ERROR 1067 (42000): Invalid default value for 'updated'
But the following:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
just works.
The same case for DATE.
As a sidenote, it is mentioned in the mysql docs:
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
even if they also say:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
Having also into account the second quote from mysql documentation, could anyone let me know why it is giving that error?
mysql sql date datetime console
add a comment |
I'm running MySql Server 5.7.11 and this sentence:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
is not working. Giving the error:
ERROR 1067 (42000): Invalid default value for 'updated'
But the following:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
just works.
The same case for DATE.
As a sidenote, it is mentioned in the mysql docs:
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
even if they also say:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
Having also into account the second quote from mysql documentation, could anyone let me know why it is giving that error?
mysql sql date datetime console
7
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly whatNULL
is for.
– Tom H
Apr 2 '16 at 14:25
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58
add a comment |
I'm running MySql Server 5.7.11 and this sentence:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
is not working. Giving the error:
ERROR 1067 (42000): Invalid default value for 'updated'
But the following:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
just works.
The same case for DATE.
As a sidenote, it is mentioned in the mysql docs:
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
even if they also say:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
Having also into account the second quote from mysql documentation, could anyone let me know why it is giving that error?
mysql sql date datetime console
I'm running MySql Server 5.7.11 and this sentence:
updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
is not working. Giving the error:
ERROR 1067 (42000): Invalid default value for 'updated'
But the following:
updated datetime NOT NULL DEFAULT '1000-01-01 00:00:00'
just works.
The same case for DATE.
As a sidenote, it is mentioned in the mysql docs:
The DATE type is used for values with a date part but no time part. MySQL retrieves and displays DATE values in 'YYYY-MM-DD' format. The supported range is '1000-01-01' to '9999-12-31'.
even if they also say:
Invalid DATE, DATETIME, or TIMESTAMP values are converted to the “zero” value of the appropriate type ('0000-00-00' or '0000-00-00 00:00:00').
Having also into account the second quote from mysql documentation, could anyone let me know why it is giving that error?
mysql sql date datetime console
mysql sql date datetime console
asked Apr 2 '16 at 14:11
EvhzEvhz
3,56142343
3,56142343
7
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly whatNULL
is for.
– Tom H
Apr 2 '16 at 14:25
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58
add a comment |
7
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly whatNULL
is for.
– Tom H
Apr 2 '16 at 14:25
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58
7
7
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly what
NULL
is for.– Tom H
Apr 2 '16 at 14:25
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly what
NULL
is for.– Tom H
Apr 2 '16 at 14:25
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58
add a comment |
10 Answers
10
active
oldest
votes
The error is because of the sql mode which can be strict mode as per latest MYSQL 5.7 documentation
MySQL Documentation 5.7 says:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
To Check MYSQL mode
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Disabling STRICT_TRANS_TABLES mode
However to allow the format 0000-00-00 00:00:00
you have to disable STRICT_TRANS_TABLES mode in mysql config file or by command
By command
SET sql_mode = '';
or
SET GLOBAL sql_mode = '';
Using the keyword GLOBAL
requires super previliges and it affects the operations all clients connect from that time on
if above is not working than go to /etc/mysql/my.cnf
(as per ubuntu) and comment out STRICT_TRANS_TABLES
Also, if you want to permanently set the sql mode at server startup then include SET sql_mode=''
in my.cnf
on Linux or MacOS. For windows this has to be done in my.ini
file.
Note
However strict mode is not enabled by default in MYSQL 5.6. Hence it does not produce the error as per MYSQL 6 documentation which says
MySQL permits you to store a “zero” value of '0000-00-00' as a “dummy date.” This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
UPDATE
Regarding the bug matter as said by @Dylan-Su:
I don't think this is the bug it the way MYSQL is evolved over the time due to which some things are changed based on further improvement of the product.
However I have another related bug report regarding the NOW()
function
Datetime field does not accept default NOW()
Another Useful note [see Automatic Initialization and Updating for TIMESTAMP and DATETIME]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
Update Regarding NO_ZERO_DATE
As of MySQL as of 5.7.4 this mode is deprecated. For previous version you must comment out the respective line in the config file. Refer MySQL 5.7 documentation on NO_ZERO_DATE
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
Wrong. I haveSTRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config hasNO_ZERO_DATE
enabled. And my local doesn't have it.
– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
|
show 4 more comments
I had this error with WAMP 3.0.6 with MySql 5.7.14.
Solution:
change line 70 (if your ini file is untouched) in c:wampbinmysqlmysql5.7.14my.ini
file from
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
to
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
and restart all services.
This will disable strict mode. As per the documentation, “strict mode” means a mode with either or both STRICT_TRANS_TABLES
or STRICT_ALL_TABLES
enabled.
The documentation says:
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
add a comment |
Config syntax issue
On some versions of MYSQL (tested 5.7.*) under *nix systems you should use this syntax:
[mysqld]
sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
These won't work:
dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
A more complete review of config values and sql-mode:
How to setup permanent Sql Mode flags
add a comment |
Just add the line: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
inside file: /etc/mysql/mysql.conf.d/mysqld.cnf
then sudo service mysql restart
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
add a comment |
It works for 5.7.8:
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc |
+-----------+
1 row in set (0.00 sec)
You can create a SQLFiddle to recreate your issue.
http://sqlfiddle.com/
If it works for MySQL 5.6 and 5.7.8, but fails on 5.7.11. Then it probably be a regression bug for 5.7.11.
add a comment |
First select current session sql_mode
:
SELECT @@SESSION.sql_mode;
Then you will get something like that default value:
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
and then set sql_mode
without 'NO_ZERO_DATE'
:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
If you have grants, you can do it also for GLOBAL
:
SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
add a comment |
This answer it's just for MySQL 5.7:
Best is not really set in blank the sql_mode, instead use in PHP a session variable with:
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
So at least you keep the another default values.
It's crazy that mysql documentation is not clear, you need delete this defeault values in sql_mode:
NO_ZERO_IN_DATE,NO_ZERO_DATE, I understand, but in the future versiones this will be discontinued.
STRICT_ALL_TABLES, with this, before parameters will be ignored, so you need delete it too.
Finally TRADITIONAL too, but documentation speak about this parameter: “give an error instead of a warning” when inserting an incorrect value into a column", with this parameter, dates with zero values is not inserted, but without yes.
MySQL is not really organised with these parameters and combinations.
add a comment |
I got into a situation where the data was mixed between NULL and 0000-00-00 for a date field. But I did not know how to update the '0000-00-00' to NULL, because
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
is not allowed any more.
My workaround was quite simple:
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
because all the incorrect my_date_field
values (whether correct dates or not) were from before this date.
1
Perfect quick solution. You could in fact also use<'0000-01-01'
since it is of course a valid date.
– Ricky McMaster
Dec 28 '18 at 15:06
add a comment |
To solve the problem with MySQL Workbench (After applying the solution on the server side) :
Remove SQL_MODE to TRADITIONAL in the preferences panel.
add a comment |
Option combinations for mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
Doesn't throw:
STRICT_TRANS_TABLES
+ NO_ZERO_DATE
Throws:
STRICT_TRANS_TABLES
+ NO_ZERO_IN_DATE
My settings in /etc/mysql/my.cnf
on Ubuntu:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36374335%2ferror-in-mysql-when-setting-default-value-for-date-or-datetime%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
10 Answers
10
active
oldest
votes
10 Answers
10
active
oldest
votes
active
oldest
votes
active
oldest
votes
The error is because of the sql mode which can be strict mode as per latest MYSQL 5.7 documentation
MySQL Documentation 5.7 says:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
To Check MYSQL mode
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Disabling STRICT_TRANS_TABLES mode
However to allow the format 0000-00-00 00:00:00
you have to disable STRICT_TRANS_TABLES mode in mysql config file or by command
By command
SET sql_mode = '';
or
SET GLOBAL sql_mode = '';
Using the keyword GLOBAL
requires super previliges and it affects the operations all clients connect from that time on
if above is not working than go to /etc/mysql/my.cnf
(as per ubuntu) and comment out STRICT_TRANS_TABLES
Also, if you want to permanently set the sql mode at server startup then include SET sql_mode=''
in my.cnf
on Linux or MacOS. For windows this has to be done in my.ini
file.
Note
However strict mode is not enabled by default in MYSQL 5.6. Hence it does not produce the error as per MYSQL 6 documentation which says
MySQL permits you to store a “zero” value of '0000-00-00' as a “dummy date.” This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
UPDATE
Regarding the bug matter as said by @Dylan-Su:
I don't think this is the bug it the way MYSQL is evolved over the time due to which some things are changed based on further improvement of the product.
However I have another related bug report regarding the NOW()
function
Datetime field does not accept default NOW()
Another Useful note [see Automatic Initialization and Updating for TIMESTAMP and DATETIME]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
Update Regarding NO_ZERO_DATE
As of MySQL as of 5.7.4 this mode is deprecated. For previous version you must comment out the respective line in the config file. Refer MySQL 5.7 documentation on NO_ZERO_DATE
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
Wrong. I haveSTRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config hasNO_ZERO_DATE
enabled. And my local doesn't have it.
– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
|
show 4 more comments
The error is because of the sql mode which can be strict mode as per latest MYSQL 5.7 documentation
MySQL Documentation 5.7 says:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
To Check MYSQL mode
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Disabling STRICT_TRANS_TABLES mode
However to allow the format 0000-00-00 00:00:00
you have to disable STRICT_TRANS_TABLES mode in mysql config file or by command
By command
SET sql_mode = '';
or
SET GLOBAL sql_mode = '';
Using the keyword GLOBAL
requires super previliges and it affects the operations all clients connect from that time on
if above is not working than go to /etc/mysql/my.cnf
(as per ubuntu) and comment out STRICT_TRANS_TABLES
Also, if you want to permanently set the sql mode at server startup then include SET sql_mode=''
in my.cnf
on Linux or MacOS. For windows this has to be done in my.ini
file.
Note
However strict mode is not enabled by default in MYSQL 5.6. Hence it does not produce the error as per MYSQL 6 documentation which says
MySQL permits you to store a “zero” value of '0000-00-00' as a “dummy date.” This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
UPDATE
Regarding the bug matter as said by @Dylan-Su:
I don't think this is the bug it the way MYSQL is evolved over the time due to which some things are changed based on further improvement of the product.
However I have another related bug report regarding the NOW()
function
Datetime field does not accept default NOW()
Another Useful note [see Automatic Initialization and Updating for TIMESTAMP and DATETIME]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
Update Regarding NO_ZERO_DATE
As of MySQL as of 5.7.4 this mode is deprecated. For previous version you must comment out the respective line in the config file. Refer MySQL 5.7 documentation on NO_ZERO_DATE
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
Wrong. I haveSTRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config hasNO_ZERO_DATE
enabled. And my local doesn't have it.
– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
|
show 4 more comments
The error is because of the sql mode which can be strict mode as per latest MYSQL 5.7 documentation
MySQL Documentation 5.7 says:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
To Check MYSQL mode
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Disabling STRICT_TRANS_TABLES mode
However to allow the format 0000-00-00 00:00:00
you have to disable STRICT_TRANS_TABLES mode in mysql config file or by command
By command
SET sql_mode = '';
or
SET GLOBAL sql_mode = '';
Using the keyword GLOBAL
requires super previliges and it affects the operations all clients connect from that time on
if above is not working than go to /etc/mysql/my.cnf
(as per ubuntu) and comment out STRICT_TRANS_TABLES
Also, if you want to permanently set the sql mode at server startup then include SET sql_mode=''
in my.cnf
on Linux or MacOS. For windows this has to be done in my.ini
file.
Note
However strict mode is not enabled by default in MYSQL 5.6. Hence it does not produce the error as per MYSQL 6 documentation which says
MySQL permits you to store a “zero” value of '0000-00-00' as a “dummy date.” This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
UPDATE
Regarding the bug matter as said by @Dylan-Su:
I don't think this is the bug it the way MYSQL is evolved over the time due to which some things are changed based on further improvement of the product.
However I have another related bug report regarding the NOW()
function
Datetime field does not accept default NOW()
Another Useful note [see Automatic Initialization and Updating for TIMESTAMP and DATETIME]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
Update Regarding NO_ZERO_DATE
As of MySQL as of 5.7.4 this mode is deprecated. For previous version you must comment out the respective line in the config file. Refer MySQL 5.7 documentation on NO_ZERO_DATE
The error is because of the sql mode which can be strict mode as per latest MYSQL 5.7 documentation
MySQL Documentation 5.7 says:
Strict mode affects whether the server permits '0000-00-00' as a valid date:
If strict mode is not enabled, '0000-00-00' is permitted and inserts produce no warning.
If strict mode is enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning.
To Check MYSQL mode
SELECT @@GLOBAL.sql_mode global, @@SESSION.sql_mode session
Disabling STRICT_TRANS_TABLES mode
However to allow the format 0000-00-00 00:00:00
you have to disable STRICT_TRANS_TABLES mode in mysql config file or by command
By command
SET sql_mode = '';
or
SET GLOBAL sql_mode = '';
Using the keyword GLOBAL
requires super previliges and it affects the operations all clients connect from that time on
if above is not working than go to /etc/mysql/my.cnf
(as per ubuntu) and comment out STRICT_TRANS_TABLES
Also, if you want to permanently set the sql mode at server startup then include SET sql_mode=''
in my.cnf
on Linux or MacOS. For windows this has to be done in my.ini
file.
Note
However strict mode is not enabled by default in MYSQL 5.6. Hence it does not produce the error as per MYSQL 6 documentation which says
MySQL permits you to store a “zero” value of '0000-00-00' as a “dummy date.” This is in some cases more convenient than using NULL values, and uses less data and index space. To disallow '0000-00-00', enable the NO_ZERO_DATE SQL mode.
UPDATE
Regarding the bug matter as said by @Dylan-Su:
I don't think this is the bug it the way MYSQL is evolved over the time due to which some things are changed based on further improvement of the product.
However I have another related bug report regarding the NOW()
function
Datetime field does not accept default NOW()
Another Useful note [see Automatic Initialization and Updating for TIMESTAMP and DATETIME]
As of MySQL 5.6.5, TIMESTAMP and DATETIME columns can be automatically initializated and updated to the current date and time (that is, the current timestamp). Before 5.6.5, this is true only for TIMESTAMP, and for at most one TIMESTAMP column per table. The following notes first describe automatic initialization and updating for MySQL 5.6.5 and up, then the differences for versions preceding 5.6.5.
Update Regarding NO_ZERO_DATE
As of MySQL as of 5.7.4 this mode is deprecated. For previous version you must comment out the respective line in the config file. Refer MySQL 5.7 documentation on NO_ZERO_DATE
edited Oct 19 '17 at 7:17
answered Apr 2 '16 at 14:46
geeksalgeeksal
2,79921534
2,79921534
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
Wrong. I haveSTRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config hasNO_ZERO_DATE
enabled. And my local doesn't have it.
– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
|
show 4 more comments
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
Wrong. I haveSTRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config hasNO_ZERO_DATE
enabled. And my local doesn't have it.
– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
2
2
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
UPDATE IGNORE is what I was looking for 👍🏻
– Afanasii Kurakin
Mar 26 '17 at 14:06
1
1
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
SET sql_mode = ''; works
– Mike
Apr 27 '17 at 9:04
2
2
Wrong. I have
STRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert 0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config has NO_ZERO_DATE
enabled. And my local doesn't have it.– Green
Jul 21 '17 at 2:11
Wrong. I have
STRICT_TRANS_TABLES
for my both MySQL instances, local and server. However, I can easily insert 0000-00-00
in my local instance, but cannot in my server instance - error is thrown. Why? Because my server MySQL config has NO_ZERO_DATE
enabled. And my local doesn't have it.– Green
Jul 21 '17 at 2:11
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
ok @Green I will figure out and update the answer if applicable
– geeksal
Jul 22 '17 at 12:06
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
In my case 'SET sql_mode = ""' did not work. 'SET GLOBAL sql_mode = "";' did the job for me.
– arjen Stens
Aug 23 '17 at 7:35
|
show 4 more comments
I had this error with WAMP 3.0.6 with MySql 5.7.14.
Solution:
change line 70 (if your ini file is untouched) in c:wampbinmysqlmysql5.7.14my.ini
file from
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
to
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
and restart all services.
This will disable strict mode. As per the documentation, “strict mode” means a mode with either or both STRICT_TRANS_TABLES
or STRICT_ALL_TABLES
enabled.
The documentation says:
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
add a comment |
I had this error with WAMP 3.0.6 with MySql 5.7.14.
Solution:
change line 70 (if your ini file is untouched) in c:wampbinmysqlmysql5.7.14my.ini
file from
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
to
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
and restart all services.
This will disable strict mode. As per the documentation, “strict mode” means a mode with either or both STRICT_TRANS_TABLES
or STRICT_ALL_TABLES
enabled.
The documentation says:
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
add a comment |
I had this error with WAMP 3.0.6 with MySql 5.7.14.
Solution:
change line 70 (if your ini file is untouched) in c:wampbinmysqlmysql5.7.14my.ini
file from
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
to
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
and restart all services.
This will disable strict mode. As per the documentation, “strict mode” means a mode with either or both STRICT_TRANS_TABLES
or STRICT_ALL_TABLES
enabled.
The documentation says:
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
I had this error with WAMP 3.0.6 with MySql 5.7.14.
Solution:
change line 70 (if your ini file is untouched) in c:wampbinmysqlmysql5.7.14my.ini
file from
sql-mode= "STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
to
sql-mode="ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
and restart all services.
This will disable strict mode. As per the documentation, “strict mode” means a mode with either or both STRICT_TRANS_TABLES
or STRICT_ALL_TABLES
enabled.
The documentation says:
"The default SQL mode in MySQL 5.7 includes these modes:
ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE,
NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, and
NO_ENGINE_SUBSTITUTION."
edited Oct 12 '17 at 11:46
Aserre
3,32432043
3,32432043
answered Oct 16 '16 at 20:22
bg17awbg17aw
1,6021321
1,6021321
add a comment |
add a comment |
Config syntax issue
On some versions of MYSQL (tested 5.7.*) under *nix systems you should use this syntax:
[mysqld]
sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
These won't work:
dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
A more complete review of config values and sql-mode:
How to setup permanent Sql Mode flags
add a comment |
Config syntax issue
On some versions of MYSQL (tested 5.7.*) under *nix systems you should use this syntax:
[mysqld]
sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
These won't work:
dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
A more complete review of config values and sql-mode:
How to setup permanent Sql Mode flags
add a comment |
Config syntax issue
On some versions of MYSQL (tested 5.7.*) under *nix systems you should use this syntax:
[mysqld]
sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
These won't work:
dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
A more complete review of config values and sql-mode:
How to setup permanent Sql Mode flags
Config syntax issue
On some versions of MYSQL (tested 5.7.*) under *nix systems you should use this syntax:
[mysqld]
sql-mode="NO_BACKSLASH_ESCAPES,STRICT_TRANS_TABLE,NO_ENGINE_SUBSTITUTION"
These won't work:
dash no quotes
sql-mode=NO_ENGINE_SUBSTITUTION
underscore no quotes
sql_mode=NO_ENGINE_SUBSTITUTION
underscore and quotes
sql_mode="NO_ENGINE_SUBSTITUTION"
A more complete review of config values and sql-mode:
How to setup permanent Sql Mode flags
edited May 23 '17 at 12:10
Community♦
11
11
answered Mar 9 '17 at 22:17
HeroselohimHeroselohim
6831714
6831714
add a comment |
add a comment |
Just add the line: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
inside file: /etc/mysql/mysql.conf.d/mysqld.cnf
then sudo service mysql restart
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
add a comment |
Just add the line: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
inside file: /etc/mysql/mysql.conf.d/mysqld.cnf
then sudo service mysql restart
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
add a comment |
Just add the line: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
inside file: /etc/mysql/mysql.conf.d/mysqld.cnf
then sudo service mysql restart
Just add the line: sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
inside file: /etc/mysql/mysql.conf.d/mysqld.cnf
then sudo service mysql restart
edited Dec 24 '17 at 11:05
Thomas Smyth
3,99951831
3,99951831
answered Dec 24 '17 at 10:47
ferreidon aftahiferreidon aftahi
392
392
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
add a comment |
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
1
1
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
Works for 5.7.23.
– user2513149
Aug 25 '18 at 20:33
add a comment |
It works for 5.7.8:
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc |
+-----------+
1 row in set (0.00 sec)
You can create a SQLFiddle to recreate your issue.
http://sqlfiddle.com/
If it works for MySQL 5.6 and 5.7.8, but fails on 5.7.11. Then it probably be a regression bug for 5.7.11.
add a comment |
It works for 5.7.8:
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc |
+-----------+
1 row in set (0.00 sec)
You can create a SQLFiddle to recreate your issue.
http://sqlfiddle.com/
If it works for MySQL 5.6 and 5.7.8, but fails on 5.7.11. Then it probably be a regression bug for 5.7.11.
add a comment |
It works for 5.7.8:
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc |
+-----------+
1 row in set (0.00 sec)
You can create a SQLFiddle to recreate your issue.
http://sqlfiddle.com/
If it works for MySQL 5.6 and 5.7.8, but fails on 5.7.11. Then it probably be a regression bug for 5.7.11.
It works for 5.7.8:
mysql> create table t1(updated datetime NOT NULL DEFAULT '0000-00-00 00:00:00');
Query OK, 0 rows affected (0.01 sec)
mysql> show create table t1;
+-------+-------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------+
| t1 | CREATE TABLE `t1` (
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+-------+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.8-rc |
+-----------+
1 row in set (0.00 sec)
You can create a SQLFiddle to recreate your issue.
http://sqlfiddle.com/
If it works for MySQL 5.6 and 5.7.8, but fails on 5.7.11. Then it probably be a regression bug for 5.7.11.
answered Apr 2 '16 at 14:38
Dylan SuDylan Su
5,0041821
5,0041821
add a comment |
add a comment |
First select current session sql_mode
:
SELECT @@SESSION.sql_mode;
Then you will get something like that default value:
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
and then set sql_mode
without 'NO_ZERO_DATE'
:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
If you have grants, you can do it also for GLOBAL
:
SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
add a comment |
First select current session sql_mode
:
SELECT @@SESSION.sql_mode;
Then you will get something like that default value:
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
and then set sql_mode
without 'NO_ZERO_DATE'
:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
If you have grants, you can do it also for GLOBAL
:
SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
add a comment |
First select current session sql_mode
:
SELECT @@SESSION.sql_mode;
Then you will get something like that default value:
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
and then set sql_mode
without 'NO_ZERO_DATE'
:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
If you have grants, you can do it also for GLOBAL
:
SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
First select current session sql_mode
:
SELECT @@SESSION.sql_mode;
Then you will get something like that default value:
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
and then set sql_mode
without 'NO_ZERO_DATE'
:
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
If you have grants, you can do it also for GLOBAL
:
SELECT @@GLOBAL.sql_mode;
SET GLOBAL sql_mode = '...';
answered Nov 7 '17 at 14:38
simhumilecosimhumileco
7,01435152
7,01435152
add a comment |
add a comment |
This answer it's just for MySQL 5.7:
Best is not really set in blank the sql_mode, instead use in PHP a session variable with:
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
So at least you keep the another default values.
It's crazy that mysql documentation is not clear, you need delete this defeault values in sql_mode:
NO_ZERO_IN_DATE,NO_ZERO_DATE, I understand, but in the future versiones this will be discontinued.
STRICT_ALL_TABLES, with this, before parameters will be ignored, so you need delete it too.
Finally TRADITIONAL too, but documentation speak about this parameter: “give an error instead of a warning” when inserting an incorrect value into a column", with this parameter, dates with zero values is not inserted, but without yes.
MySQL is not really organised with these parameters and combinations.
add a comment |
This answer it's just for MySQL 5.7:
Best is not really set in blank the sql_mode, instead use in PHP a session variable with:
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
So at least you keep the another default values.
It's crazy that mysql documentation is not clear, you need delete this defeault values in sql_mode:
NO_ZERO_IN_DATE,NO_ZERO_DATE, I understand, but in the future versiones this will be discontinued.
STRICT_ALL_TABLES, with this, before parameters will be ignored, so you need delete it too.
Finally TRADITIONAL too, but documentation speak about this parameter: “give an error instead of a warning” when inserting an incorrect value into a column", with this parameter, dates with zero values is not inserted, but without yes.
MySQL is not really organised with these parameters and combinations.
add a comment |
This answer it's just for MySQL 5.7:
Best is not really set in blank the sql_mode, instead use in PHP a session variable with:
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
So at least you keep the another default values.
It's crazy that mysql documentation is not clear, you need delete this defeault values in sql_mode:
NO_ZERO_IN_DATE,NO_ZERO_DATE, I understand, but in the future versiones this will be discontinued.
STRICT_ALL_TABLES, with this, before parameters will be ignored, so you need delete it too.
Finally TRADITIONAL too, but documentation speak about this parameter: “give an error instead of a warning” when inserting an incorrect value into a column", with this parameter, dates with zero values is not inserted, but without yes.
MySQL is not really organised with these parameters and combinations.
This answer it's just for MySQL 5.7:
Best is not really set in blank the sql_mode, instead use in PHP a session variable with:
SET SESSION sql_mode= 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
So at least you keep the another default values.
It's crazy that mysql documentation is not clear, you need delete this defeault values in sql_mode:
NO_ZERO_IN_DATE,NO_ZERO_DATE, I understand, but in the future versiones this will be discontinued.
STRICT_ALL_TABLES, with this, before parameters will be ignored, so you need delete it too.
Finally TRADITIONAL too, but documentation speak about this parameter: “give an error instead of a warning” when inserting an incorrect value into a column", with this parameter, dates with zero values is not inserted, but without yes.
MySQL is not really organised with these parameters and combinations.
edited Oct 20 '18 at 8:26
simhumileco
7,01435152
7,01435152
answered Jun 10 '17 at 12:35
stackdavestackdave
2,18552340
2,18552340
add a comment |
add a comment |
I got into a situation where the data was mixed between NULL and 0000-00-00 for a date field. But I did not know how to update the '0000-00-00' to NULL, because
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
is not allowed any more.
My workaround was quite simple:
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
because all the incorrect my_date_field
values (whether correct dates or not) were from before this date.
1
Perfect quick solution. You could in fact also use<'0000-01-01'
since it is of course a valid date.
– Ricky McMaster
Dec 28 '18 at 15:06
add a comment |
I got into a situation where the data was mixed between NULL and 0000-00-00 for a date field. But I did not know how to update the '0000-00-00' to NULL, because
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
is not allowed any more.
My workaround was quite simple:
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
because all the incorrect my_date_field
values (whether correct dates or not) were from before this date.
1
Perfect quick solution. You could in fact also use<'0000-01-01'
since it is of course a valid date.
– Ricky McMaster
Dec 28 '18 at 15:06
add a comment |
I got into a situation where the data was mixed between NULL and 0000-00-00 for a date field. But I did not know how to update the '0000-00-00' to NULL, because
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
is not allowed any more.
My workaround was quite simple:
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
because all the incorrect my_date_field
values (whether correct dates or not) were from before this date.
I got into a situation where the data was mixed between NULL and 0000-00-00 for a date field. But I did not know how to update the '0000-00-00' to NULL, because
update my_table set my_date_field=NULL where my_date_field='0000-00-00'
is not allowed any more.
My workaround was quite simple:
update my_table set my_date_field=NULL where my_date_field<'1000-01-01'
because all the incorrect my_date_field
values (whether correct dates or not) were from before this date.
edited Dec 28 '18 at 15:54
Ricky McMaster
1,2971214
1,2971214
answered Oct 22 '18 at 13:54
Martin T.Martin T.
837
837
1
Perfect quick solution. You could in fact also use<'0000-01-01'
since it is of course a valid date.
– Ricky McMaster
Dec 28 '18 at 15:06
add a comment |
1
Perfect quick solution. You could in fact also use<'0000-01-01'
since it is of course a valid date.
– Ricky McMaster
Dec 28 '18 at 15:06
1
1
Perfect quick solution. You could in fact also use
<'0000-01-01'
since it is of course a valid date.– Ricky McMaster
Dec 28 '18 at 15:06
Perfect quick solution. You could in fact also use
<'0000-01-01'
since it is of course a valid date.– Ricky McMaster
Dec 28 '18 at 15:06
add a comment |
To solve the problem with MySQL Workbench (After applying the solution on the server side) :
Remove SQL_MODE to TRADITIONAL in the preferences panel.
add a comment |
To solve the problem with MySQL Workbench (After applying the solution on the server side) :
Remove SQL_MODE to TRADITIONAL in the preferences panel.
add a comment |
To solve the problem with MySQL Workbench (After applying the solution on the server side) :
Remove SQL_MODE to TRADITIONAL in the preferences panel.
To solve the problem with MySQL Workbench (After applying the solution on the server side) :
Remove SQL_MODE to TRADITIONAL in the preferences panel.
answered Feb 9 '17 at 12:12
VindicVindic
1245
1245
add a comment |
add a comment |
Option combinations for mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
Doesn't throw:
STRICT_TRANS_TABLES
+ NO_ZERO_DATE
Throws:
STRICT_TRANS_TABLES
+ NO_ZERO_IN_DATE
My settings in /etc/mysql/my.cnf
on Ubuntu:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
add a comment |
Option combinations for mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
Doesn't throw:
STRICT_TRANS_TABLES
+ NO_ZERO_DATE
Throws:
STRICT_TRANS_TABLES
+ NO_ZERO_IN_DATE
My settings in /etc/mysql/my.cnf
on Ubuntu:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
add a comment |
Option combinations for mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
Doesn't throw:
STRICT_TRANS_TABLES
+ NO_ZERO_DATE
Throws:
STRICT_TRANS_TABLES
+ NO_ZERO_IN_DATE
My settings in /etc/mysql/my.cnf
on Ubuntu:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
Option combinations for mysql Ver 14.14 Distrib 5.7.18, for Linux (x86_64)
.
Doesn't throw:
STRICT_TRANS_TABLES
+ NO_ZERO_DATE
Throws:
STRICT_TRANS_TABLES
+ NO_ZERO_IN_DATE
My settings in /etc/mysql/my.cnf
on Ubuntu:
[mysqld]
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
answered Jul 21 '17 at 2:59
GreenGreen
7,71930103174
7,71930103174
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f36374335%2ferror-in-mysql-when-setting-default-value-for-date-or-datetime%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
7
Why would you want a default that is obviously meaningless? If the date is unknown then that's exactly what
NULL
is for.– Tom H
Apr 2 '16 at 14:25
As a note: This works in version 5.6 on SQL Fiddle -- sqlfiddle.com/#!9/02c98.
– Gordon Linoff
Apr 2 '16 at 14:35
@Karlos check the updated answer.
– geeksal
Apr 2 '16 at 14:58