Bij bijna alle database bewerkingen die ik doe krijg ik de foutmelding:
Fout in query: #1067 – Foutieve standaard waarde voor ‘created’
Ik werk lokaal en heb uiteindelijk XXAMPP opnieuw geïnstalleerd en ook de website. Helaas, de foutmelding blijft. Kan iemand mij helpen?
Met vriendelijke groet, Dick
Oudere versies van MySQL of MariaDB accepteerden soms rare default waarden.
Bijvoorbeeld "" voor een integer, of voor een datetime.
of NULL als default waarde, maar dan NOT-NULL bij de eigenschappen.
Ik schat in dat je kolom Created een datetime of ander soort timestamp is,
je die niet invult in de insert query, en dat je database zich nu afvraagt hoe hij een lege string in een datetime moet omzetten.
Dat, al dan niet in combinatie met een trigger die niet afgaat:
je kunt ook een trigger op het inserten zetten, die in zo'n geval created = now() doet.
(zou niet de eerste zijn die bij het verhuizen van een site de triggers of stored-procedures niet meepakt)
[size=xsmall]Toevoeging op 01/02/2022 15:11:57:[/size]
En uit het voorbeeld van Adoptive's link:
0000-00-00 is geen valide datum. Ook daar zou iets zinnigs als NOW() in moeten, of je moet NULL accepteren als waarde.
Heb je de link met mogelijke oplossingen al bekeken?
[size=xsmall]Toevoeging op 01/02/2022 16:04:03:[/size]
Ik ben de suggesties aan het proberen. Ik probeer "NO_ZERO_IN_DATE,NO_ZERO_DATE" weh te halen maar dat lukt nog niet. Ik heb niet veel ervaring met PHP.
[size=xsmall]Toevoeging op 01/02/2022 16:06:42:[/size]
Ivo P op 01/02/2022 15:09:52
Oudere versies van MySQL of MariaDB accepteerden soms rare default waarden.
Bijvoorbeeld "" voor een integer, of voor een datetime.
of NULL als default waarde, maar dan NOT-NULL bij de eigenschappen.
Ik schat in dat je kolom Created een datetime of ander soort timestamp is,
je die niet invult in de insert query, en dat je database zich nu afvraagt hoe hij een lege string in een datetime moet omzetten.
Dat, al dan niet in combinatie met een trigger die niet afgaat:
je kunt ook een trigger op het inserten zetten, die in zo'n geval created = now() doet.
(zou niet de eerste zijn die bij het verhuizen van een site de triggers of stored-procedures niet meepakt)
[size=xsmall]Toevoeging op 01/02/2022 15:11:57:[/size]
En uit het voorbeeld van Adoptive's link:
0000-00-00 is geen valide datum. Ook daar zou iets zinnigs als NOW() in moeten, of je moet NULL accepteren als waarde.
[size=xsmall]Toevoeging op 01/02/2022 16:09:16:[/size]
Ik heb bij created inderdaad staan: created datetime Nee 0000-00-00 00:00:00.
Verder: sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTIO...
Heb je wellicht een concreet commando ter verbetering?
[size=xsmall]Toevoeging op 01/02/2022 16:10:21:[/size]
Ivo P op 01/02/2022 15:09:52
Oudere versies van MySQL of MariaDB accepteerden soms rare default waarden.
Bijvoorbeeld "" voor een integer, of voor een datetime.
of NULL als default waarde, maar dan NOT-NULL bij de eigenschappen.
Ik schat in dat je kolom Created een datetime of ander soort timestamp is,
je die niet invult in de insert query, en dat je database zich nu afvraagt hoe hij een lege string in een datetime moet omzetten.
Dat, al dan niet in combinatie met een trigger die niet afgaat:
je kunt ook een trigger op het inserten zetten, die in zo'n geval created = now() doet.
(zou niet de eerste zijn die bij het verhuizen van een site de triggers of stored-procedures niet meepakt)
[size=xsmall]Toevoeging op 01/02/2022 15:11:57:[/size]
En uit het voorbeeld van Adoptive's link:
0000-00-00 is geen valide datum. Ook daar zou iets zinnigs als NOW() in moeten, of je moet NULL accepteren als waarde.
Ik heb bij created inderdaad staan: created datetime Nee 0000-00-00 00:00:00.
En als je daar eens 1970-01-01 00:00:00 van maakt?
[size=xsmall]Toevoeging op 01/02/2022 16:38:25:[/size]
als zou ik de voorkeur hebben voor Default = NULL (en dan ook allow null op Ja zetten)
?Onbekende gebruiker
02-02-2022 15:14
gewijzigd op 02-02-2022 15:17
Waar je naar kan kijken is of de default waarde van de kolom created van de tabel waar je mee bezig bent niet het probleem is. Als je een regel aan de tabel toevoegt, en je noemt de kolom created niet, pakt de database de waarde die is opgeslagen in de metadata van de tabel. En als dat een ongeldige waarde is, kan het zijn dat je die melding krijgt (dat acht ik waarschijnlijk voor MySQL en MariaDB).
Controleer of de defaultwaarde het probleem is met SQL:
INSERT INTO `<tabelnaam>` (`<kolom1>`, `<kolom2>`, `created`)
VALUES '<waarde1>', '<waarde2>', '<zinnige waarde voor kolom created>';
Als er dan geen melding verschijnt bij die query, kan je er vanuitgaan dat het probleem in de metadata van de tabel zit.
Fix:
ALTER TABLE `<tabelnaam>` ALTER COLUMN `created` DROP DEFAULT;
Maar in plaats van het weghalen kan je ook een zinnige default aan created toekennen:
ALTER TABLE `<tabelnaam>` ALTER COLUMN `created` SET CURRENT_DATE();
Of CURRENT_TIMESTAMP() als het datatype geen datum is maar datumtijd.
Hartelijk dank voor alle suggesties, ik ben er mee aan de slag gegaan.
Een aantal waar ik niet verder mee kwam:
- Als ik 1970-01-01 00:00:00 probeer in te vullen krijg ik zelfde foutmelding voor een volgende rij met 'datetime'.
- Bij het maken van een nieuwe rij komt bij opslaan dezelfde foutmelding.
- ALTER TABLE `jos_content` ALTER COLUMN `created` SET_CURRENT_TIMESTAMP(1970-01-01 00:00:00); Werkt helaas niet!
Waar ik wel verder mee kom is het volgende:
show variables like 'sql_mode' ;
geeft als resultaat:
sql_mode NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTIO...
Ik heb ook een live site waar fout #1067 niet optreedt. Daar krijg ik:
sql_mode NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Ik voer nu eerst uit:
SET GLOBAL sql_mode = '';
De foutmelding is nu verdwenen en vervolgens:
SET GLOBAL sql_mode = 'NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
zodat de setting gelijk wordt aan de live site.
Ik nu nog twee vragen:
1. Kan er iets verkeerd gaan met de settings die ik gedaan heb? Ik overzie niet echt wat het resultaat is.
2. Ik heb de wijzigingen aangebracht via de tab SQL in phpMyAdmin. Dat betekent dat bij het opnieuw opstarten van XAMPP de wijzigingen verdwenen zijn. Kan ik “ergens” de SQL-opdrachten aanbrengen zodat deze automatisch worden uitgevoerd?