De typen DATETIME, DATE en TIMESTAMP. MySQL-referentiehandleiding

Eerst een korte beschrijving van elk van de typen:

  • TIMESTAMP is een gegevenstype voor het opslaan van datum en tijd. De gegevens worden opgeslagen als het aantal seconden sinds het begin van het "Unix-tijdperk". Het waardenbereik is 1970-01-01 00:00:00 - 2038-12-31 00:00:00. Het duurt 4 bytes.
  • JAAR is het gegevenstype voor het opslaan van het jaar. Waardenbereik: 1901 - 2155. Neemt 1 byte in beslag.
  • DATE is een gegevenstype voor het opslaan van een datum. Het waardenbereik is 1000-01-01 tot en met 9999-12-31. Het duurt 3 bytes.
  • TIME is een gegevenstype voor het opslaan van tijd. Het bereik is −828: 59: 59 - 828: 59: 59. Het duurt 3 bytes.
  • DATETIME is een gegevenstype voor het opslaan van datum en tijd. Het waardenbereik is 1000-01-01 00:00:00 - 9999-12-31 00:00:00. Het neemt 8 bytes in beslag.

Opmerking voor de gastvrouw... Interessant is dat de meeste programmeurs aannemen dat "timestamp" Unix-tijd is. In feite is een tijdstempel een label, een reeks tekens die de datum en/of tijd aangeeft waarop een bepaalde gebeurtenis plaatsvond. En "Unix-tijd" of POSIX-tijd is het aantal seconden sinds middernacht 1 januari 1970 UTC. Tijdstempel is breder dan Unix-tijd.

Na analyse van de beschrijving van de hierboven gepresenteerde typen, kunt u bijna alle conclusies trekken over de voor- en nadelen van bepaalde typen. Alles is vrij eenvoudig en duidelijk.

Maar voordat ik het heb over het gebruik van deze typen, wil ik opmerken dat in de praktijk vaak een ander type wordt gebruikt om de datum en tijd op te slaan: een geheel getal (om de datum op te slaan - INT (4 bytes), datum en tijd - BIGINT ( 8 bytes)). Het verschil tussen het gebruik van integer-typen van DATE en DATETIME is alleen dat de gegevens niet worden opgemaakt tijdens de uitvoer, en in berekeningen met datums en tijden moeten integers worden geconverteerd naar het overeenkomstige kalendertype. Bovendien is er geen validatiecontrole op de ingediende waarde voordat deze wordt opgeslagen. Sorteermogelijkheden blijven bestaan. Daarom is het logisch om INT en BIGINT in dezelfde gevallen te gebruiken als DATE en DATETIME, om de overdraagbaarheid en onafhankelijkheid van het DBMS te maximaliseren. Ik zie geen andere voordelen, indien aanwezig, stel ik voor om in de opmerkingen aan te geven.

Kalendergegevenstypes gebruiken in MySQL

Laten we beginnen met de eenvoudigste - type JAAR... Het enige voordeel is het kleine formaat - slechts 1 byte. Maar hierdoor is er een strikte beperking op het bereik van geldige waarden (een type kan maar 255 verschillende waarden opslaan). Ik kan me moeilijk een praktische situatie voorstellen waarin je jaren strikt in het bereik van 1901 tot 2155 zou moeten opslaan. Bovendien geeft het SMALLINT-type (2 bytes) een bereik dat in de meeste situaties voldoende is om een ​​jaar op te slaan. En tegenwoordig heeft het geen zin om 1 byte per rij op te slaan in de databasetabel.

Types DATUM en DATUM TIJD kunnen worden gecombineerd tot één groep. Ze slaan datum of datum en tijd op met een vrij groot aantal geldige waarden, ongeacht de tijdzone die op de server is ingesteld. Het gebruik ervan heeft zeker veel praktische zin. Maar als u de data van historische gebeurtenissen die teruggaan in het verleden voor de gewone tijdrekening wilt opslaan, moet u andere gegevenstypen kiezen. Voor het opslaan van data voor bepaalde evenementen die mogelijk buiten het bereik van het TIMESTAMP-type vallen (verjaardagen, productreleasedatums, presidentsverkiezingen, lanceringen van ruimteraketten, enz.), zijn deze typen perfect. Bij het gebruik van deze typen moet u rekening houden met één belangrijke nuance, maar daarover hieronder meer.

Soort van TIJD kan worden gebruikt om een ​​tijdspanne op te slaan wanneer precisie niet nodig is, minder dan 1 seconde en een tijdspanne van minder dan 829 uur. Hier valt niets meer aan toe te voegen.

Het meest interessante type blijft - TIJDSTEMPEL... Het moet worden beschouwd in vergelijking met DATE en DATETIME: TIMESTAMP is ook bedoeld om de datum en / of tijd van optreden van bepaalde gebeurtenissen op te slaan. Een belangrijk verschil tussen beide in de reeksen van waarden: het is duidelijk dat TIMESTAMP niet geschikt is voor het opslaan van historische gebeurtenissen (zelfs zoals verjaardagen), maar het is geweldig voor het opslaan van huidige (registratie, datums van posten van artikelen, goederen toevoegen, bestellingen plaatsen) ) en aankomende evenementen in de voorzienbare toekomstige evenementen (releases van nieuwe versies, kalenders en planners, enz.).

Het belangrijkste gemak van het gebruik van het type TIMESTAMP is dat u voor kolommen van dit type in tabellen een standaardwaarde kunt instellen in de vorm van het vervangen van de huidige tijd, evenals het instellen van de huidige tijd bij het bijwerken van een record. Als je deze functies nodig hebt, dan is TIMESTAMP met een kans van 99% precies wat je nodig hebt. (Zie hiervoor de handleiding.)

Wees niet bang dat uw software stopt met werken als u 2038 nadert. Ten eerste, tot die tijd zal uw software hoogstwaarschijnlijk gewoon stoppen met gebruiken (vooral de versies die nu worden geschreven). Ten tweede, als deze datum nadert, zullen de MySQL-ontwikkelaars zeker iets bedenken om uw software draaiende te houden. Alles zal worden opgelost, evenals het Y2K-probleem.

Het TIMESTAMP-type wordt dus gebruikt om de datums en tijden van gebeurtenissen van onze tijd op te slaan, en DATETIME en DATE - om de datums en tijden van historische gebeurtenissen of gebeurtenissen uit de verre toekomst op te slaan.

Waardebereiken zijn een belangrijk verschil tussen de typen TIMESTAMP, DATETIME en DATE, maar niet het belangrijkste verschil. Het belangrijkste wat TIMESTAMP slaat de waarde op in UTC. Wanneer een waarde wordt opgeslagen, wordt deze vertaald van de huidige tijdzone naar UTC en wanneer deze wordt gelezen, wordt deze vertaald vanuit UTC gedurende de huidige tijdzone. DATETIME en DATE slaan en geven altijd dezelfde tijd weer, ongeacht de tijdzones.

Tijdzones worden globaal ingesteld in MySQL DBMS of voor de huidige verbinding Dit laatste kan worden gebruikt om de werking van verschillende gebruikers in verschillende tijdzones op DBMS-niveau te garanderen. Alle tijdwaarden worden fysiek opgeslagen in UTC en ontvangen van de klant en aan de klant gegeven - in de waarden van zijn tijdzone. Maar alleen bij gebruik van het gegevenstype TIMESTAMP. DATE en DATETIME accepteren, bewaren en retourneren altijd dezelfde waarde.

De functie NU () en zijn synoniemen retourneren een tijdwaarde in de huidige tijdzone van de gebruiker.

Met al deze omstandigheden in gedachten, moet uiterste voorzichtigheid worden betracht bij het wijzigen van de tijdzone binnen de serververbinding en bij het gebruik van de typen DATE en DATETIME. Als u de datum (bijvoorbeeld de geboortedatum) moet opslaan, is er geen probleem. De geboortedatum is in elke zone hetzelfde. Die. als je geboren bent op 1 januari om 0:00 UTC / GMT + 0, dan is dit niet betekent dat ze in Amerika je verjaardag op 31 december vieren. Maar als je ervoor kiest om te houden tijd gebeurtenissen in de DATETIME-kolom, dan is er gewoon geen manier om werk te bouwen met gebruikerstijdzones op DBMS-niveau. Laat me het uitleggen met een voorbeeld:

Gebruiker X werkt in de UTC / GMT + 2 zone, Y - in de UTC / GMT + 3 zone. Voor gebruikersverbindingen met MySQL wordt een bijbehorende (elk heeft zijn eigen) tijdzone ingesteld. De gebruiker plaatst een bericht op het forum, we zijn geïnteresseerd in de datum waarop het bericht is geschreven.

Optie 1: DATETIME. Gebruiker X schrijft een bericht om 14:00 UTC / GMT + 2. De waarde in het "datum" veld van het bericht wordt vervangen als resultaat van de uitvoering van de NOW () functie - 14:00. Gebruiker Y leest de tijd van het schrijven van het bericht en ziet dezelfde 14:00 uur. Maar hij heeft UTC / GMT + 3 in zijn instellingen en hij denkt dat het bericht niet alleen nu is geschreven, maar een uur geleden.

Optie 2: TIJDSTEMPEL. Gebruiker X schrijft een bericht om 14:00 UTC / GMT + 2. Het veld "datum" bevat het resultaat van het uitvoeren van de functie NU () - in dit geval 12:00 UTC / GMT + 0. Gebruiker Y leest de tijd af waarop hij het bericht heeft geschreven en krijgt (UTC / GMT + 3) (12:00 UTC / GMT + 0) = 15:00 UTC / GMT + 3. Alles wordt precies zoals we willen. En het belangrijkste is dat het buitengewoon handig is om het te gebruiken: u hoeft geen time-casting-code te schrijven om aangepaste tijdzones te ondersteunen.

De mogelijkheden om de huidige tijd te vervangen en te werken met tijdzones in het TIMESTAMP-type zijn zo zwaar dat als u een datum zonder tijd in een bepaald logboek moet opslaan, u toch TIMESTAMP moet gebruiken in plaats van DATE, zonder 1 byte van de verschil tussen hen. Let tegelijkertijd gewoon niet op "00:00:00".

Als u TIMESTAMP niet kunt gebruiken vanwege het relatief kleine bereik van de waarden (en meestal zijn dit 1-2 gevallen versus 10-15 in de sitebasis), moet u DATETIME gebruiken en de waarden zorgvuldig aanpassen in de juiste plaatsen (dwz vertaal bij het schrijven de datum in UTC in dit veld, en bij het lezen - gedurende de tijd in de zone van de lezende gebruiker). Als u alleen de datum opslaat, maakt het hoogstwaarschijnlijk niet uit welke tijdzone u heeft: iedereen viert het nieuwe jaar op 1 januari lokale tijd, hier hoeft niets vertaald te worden.

De typen DATETIME, DATE en TIMESTAMP

De typen DATETIME, DATE en TIMESTAMP zijn aan elkaar gerelateerd. Deze sectie beschrijft hun kenmerken, hoe ze op elkaar lijken en hoe ze verschillen.
Het DATETIME-type wordt gebruikt wanneer u waarden moet hebben die zowel datum als tijd bevatten. MySQL haalt DATETIME-waarden op en geeft ze weer in het formaat TGGT-MM-DD HH: MM: SS ". Ondersteunde waarden variëren van" 1000-01-01 00:00:00 "tot" 9999-12-31 23: 59: 59 "(Ondersteund betekent dat eerdere waarden kunnen werken, maar dit is niet gegarandeerd.)
Het DATE-type wordt gebruikt wanneer u waarden nodig hebt die alleen de datum bevatten, zonder de tijd. MySQL haalt DATETIME-waarden op en geeft ze weer in de indeling JJJJ-MM-DD. Het ondersteunde bereik is H000-01-0G tot "9999-12-31".
Het kolomtype TIMESTAMP heeft een aantal eigenschappen, afhankelijk van de MySQL-versie en de SQL-modus waarin de server draait. Deze eigenschappen worden verderop in deze sectie beschreven.
U kunt waarden van de typen DATETIME, DATE en TIMESTAMP specificeren met behulp van een van de gebruikelijke formaten:

  1. Als een string in het formaat "JJJJ-MM-DD UU: MM: SS of" JJ-MM-DD UU: MM: SS. Een ontspannen syntaxis is toegestaan: elk leesteken kan worden gebruikt als scheidingsteken tussen datum en tijd. Bijvoorbeeld, "98-12-31 11:30:45", "98.12.31 11 + 30 + 45", "98/12/31 11 * 30 * 45" en "98012031 11L30L45" zijn equivalent.
  2. Als string in het formaat "JJJJ-MM-DD" of "JJ-MM-DD". Een ontspannen syntaxis is ook toegestaan. De volgende waarden zijn bijvoorbeeld equivalent: "98-12-31", "98.12.31", "98/12/31" en "98012031".
  3. Als een niet-gescheiden string in het formaat "YYYYMMDDHHMMSS" of "YYMMDDHHMMSS", ervan uitgaande dat de string betekenisvol is als datum. "19970523091528" en "970523091528" worden bijvoorbeeld geïnterpreteerd als "1997-0 5-23 09:15:28", maar "971122129015" is onjuist (omdat het een betekenisloze minuutwaarde heeft) en wordt "0000-00-00 00:00: 00 ".
  4. Als een niet-gescheiden tekenreeks in het formaat "JJJJMMDD" of TYMMDD ", ervan uitgaande dat de tekenreeks zinvol is als een datum. Bijvoorbeeld," 19970523 "en" 980523 "worden geïnterpreteerd als" 1997-05-23 ", maar" 971332 " is onjuist (ongeldige waarde maand en dag) en verandert in "0000-00-00".
  5. Als een getal in de notatie JJJJMMDDHHMMSS of JJMMDDHHMMSS, ervan uitgaande dat het getal logisch is als datum. 19830905132800 en 830905132800 worden bijvoorbeeld geïnterpreteerd als "1983-09-05 13:28:00".
  6. Als een getal in het formaat JJJJMMDD of JJMMDD, ervan uitgaande dat het getal logisch is als datum. 19830905 en 830905 worden bijvoorbeeld geïnterpreteerd als "1983-09-05".
  7. Als resultaat van een functie die een acceptabele DATETIME-, DATE- of TIMESTAMP-waarde retourneert, zoals NOW () of CURRENT_DATE.

Ongeldige DATETIME-, DATE- of TIMESTAMP-waarden worden geconverteerd naar nulwaarden van het overeenkomstige type ("0000-00-00 00:00:00", "0000-00-00" of 00000000000000).
Voor waarden die zijn opgegeven als een tekenreeks die een datumscheidingsteken bevat, is het niet nodig om twee cijfers op te geven voor een maand of dag die kleiner is dan 10. "1976-6-9" is hetzelfde als "1976-06-09 ". Evenzo hoeft u voor waarden die zijn opgegeven als een tekenreeks inclusief een tijdscheidingsteken, geen twee cijfers op te geven voor uren, minuten en seconden die kleiner zijn dan 10. "1979-10-30 1: 2: 3" is de hetzelfde, dat "1979-10-30 01:02:03".


Waarden, gespecificeerd als een getal, moeten 6, 8, 12 of 14 bits lang zijn. Als een getal 8 of 14 cijfers lang is, wordt aangenomen dat het de vorm JJJJMMDD of JJJJMMDDHHMMSS heeft en dat het jaartal wordt gespecificeerd in vier cijfers. Als het nummer 6 of 12 is, wordt aangenomen dat het de notatie JJMMDD of JJMMDDHHMMSS heeft en wordt het jaar gespecificeerd als twee cijfers. Getallen met een andere lengte dan 6, 8, 12 en 14 worden opgevuld met voorloopnullen tot het dichtstbijzijnde aantal cijfers in het opgegeven bereik.

Waarden die als een niet-gescheiden tekenreeks worden gegeven, worden geïnterpreteerd met hun lengte zoals hierboven beschreven. Als de tekenreeks 8 of 14 tekens lang is, wordt aangenomen dat het jaartal is opgegeven in een 4-cijferig formaat. Anders wordt aangenomen dat het jaar wordt aangegeven door de eerste twee tekens. De tekenreeks wordt van links naar rechts geïnterpreteerd om jaar-, maand-, dag-, uur-, minuut- en secondewaarden te extraheren. Dit betekent dat u geen strings mag gebruiken die korter zijn dan 6 karakters. Als u bijvoorbeeld "9903" voor maart 1999 gebruikt, zult u merken dat MySQL een nuldatum in de tabel zal invoegen. Dit komt door het feit dat de jaar- en maandwaarden 99 en 03 zijn, maar het deel dat de dag aangeeft volledig ontbreekt, dat wil zeggen dat deze waarde niet de juiste datum instelt. Vanaf MySQL 3.23 kunt u echter expliciet een maand- of dagwaarde van nul specificeren. U kunt bijvoorbeeld "990300" opgeven om de waarde "1999-03-00" in de tabel in te voegen.
Binnen bepaalde grenzen kunt u waarden van het ene type toewijzen aan objecten van een ander type. In dit geval is echter enige vervorming met verlies van informatie mogelijk:

  1. Als u een DATE-waarde toewijst aan een DATETIME- of TIMESTAMP-object, wordt aangenomen dat het tijdgedeelte van de waarde "00:00:00" is omdat DATE-waarden geen tijdinformatie bevatten.
  2. Als u een DATETIME- of tiMesTAMP-waarde toewijst aan een DATE-object, gaat het tijdelijke deel van de waarde verloren omdat de DATE deze niet kan bevatten.
  3. Onthoud dat hoewel DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven met dezelfde set indelingen, hun geldige bereiken verschillen. TIMESTAMP-waarden kunnen bijvoorbeeld niet eerder zijn dan 1970 of later dan 2037. Dit betekent dat een datum zoals "1968-01-10", die perfect geldig is voor een DATETIME of DATE, geen TIMESTAMP is en zal worden geconverteerd naar 0 wanneer deze aan een dergelijk object wordt toegewezen.

Er zijn ook enkele valkuilen waarmee u rekening moet houden bij het opgeven van datumwaarden:

  1. Het ontspannen formaat van waarden die zijn gespecificeerd als strings kan misleidend zijn. Een waarde als "10:11:12" kan er bijvoorbeeld uitzien als een tijd omdat het scheidingsteken ":" wordt gebruikt, maar als deze in de context van een datum wordt gebruikt, wordt deze geïnterpreteerd als "2010-11-12". Tegelijkertijd is de waarde "10:45:15"
    wordt geconverteerd naar "0000-00-00" omdat "45" geen geldige maand is.
  2. MySQL Server voert alleen basisdatumvalidatie uit: de waardenbereiken voor jaar, maand en dag zijn respectievelijk 1000 tot 9999, 00 tot 12 en 00 tot 31. Alle datums die delen buiten deze bereiken bevatten, worden geconverteerd naar " 0000 -00-00 ". Onthoud dat u hierdoor ongeldige datums kunt opslaan, zoals "2002-04-31". Voer een in-app-validatie uit om ervoor te zorgen dat de datum correct is.
  • Datums met een jaartal van twee cijfers zijn dubbelzinnig omdat de eeuw onbekend is. MySQL interpreteert jaren van twee cijfers als volgt: * Jaren in het bereik 00-69 worden geconverteerd naar 2000-2069.
  • Een jaar in het bereik 70-99 wordt omgerekend naar 1970-1999.
TIMESTAMP-eigenschappen in MySQL-versies vóór 4.1
TIMESTAMP is een kolomtype dat kan worden gebruikt om automatisch de huidige datum en tijd te stempelen bij het uitvoeren van UPDATE- of INSERT-bewerkingen. Als de tabel meerdere TIMESTAMP-kolommen bevat, wordt alleen de eerste automatisch bijgewerkt.
De eerste TIMESTAMP-kolom in de tabel wordt automatisch bijgewerkt wanneer een van de volgende situaties zich voordoet:
  1. Wanneer u het expliciet instelt op NULL.
  2. De kolom is niet expliciet gespecificeerd in een INSERT- of LOAD DATA INFILE-instructie.
  3. De kolom wordt niet expliciet gespecificeerd in de UPDATE-instructie, maar de waarde van een andere kolom is gewijzigd. Een UPDATE-instructie die een kolom instelt op dezelfde waarde als voorheen, werkt de TIMESTAMP-kolom niet bij. Als u een oude waarde toewijst, negeert MySQL deze om efficiëntieredenen.

TIMESTAMP-kolommen kunnen ook worden bijgewerkt met de huidige datum en tijd door ze expliciet op de gewenste waarde in te stellen. Dit geldt zelfs voor de eerste kolom TIMESTAMP. U kunt deze eigenschap bijvoorbeeld gebruiken als u de waarde van een kolom wilt instellen op de huidige datum en tijd bij het maken van een rij, maar deze niet wilt wijzigen bij latere updates van de rij:

  1. Laat MySQL de kolomwaarde instellen wanneer de rij wordt gemaakt. Dit initialiseert het naar de huidige datum- en tijdwaarde.
  2. Stel bij volgende updates voor andere kolommen in de rij de TIMESTAMP-kolom in op de huidige waarde:

UPDATE tafel naam
SET kolom_ imes tamp- column_Ytestamp, other_column1 = new_section1, other_column2= nieuwe_lees2, ...
Een andere manier om een ​​kolom te onderhouden die de aanmaaktijd van een rij registreert, is door een DATETIME-kolom te gebruiken die wordt geïnitialiseerd op NU () wanneer de rij wordt gemaakt en die later niet wordt gewijzigd.
TIMESTAMP-waarden kunnen variëren van begin 1970 tot een deel van 2037 in een resolutie van één seconde. De waarden worden weergegeven als getallen.
Het formaat waarin MySQL TIMESTAMP-waarden ophaalt en weergeeft, hangt af van de weergavebreedte, zoals tabel 1 illustreert. 4.3. Het volledige TIMESTAMP-formaat is 14 bits lang, maar TIMESTAMP-kolommen kunnen ook in een korter weergaveformaat worden gedefinieerd.

Tabel Afhankelijkheid van het weergaveformaat van de breedte

Alle TIMESTAMP-kolommen hebben dezelfde opslaggrootte, ongeacht het weergaveformaat. De meest gebruikte formaten zijn 6, 8, 12 en 14 karakters. U kunt een willekeurige weergavegrootte instellen bij het maken van een tabel, maar waarden 0 en meer dan 14 worden teruggebracht tot 14. Oneven waarden van 1 tot 13 worden teruggebracht tot het dichtstbijzijnde grotere even.
TIMESTAMP-kolommen slaan geldige waarden op met de volledige precisie waarmee ze zijn opgegeven, ongeacht de weergavebreedte. Hier zijn echter enkele beperkingen aan verbonden:

  1. U moet altijd het jaar, de maand en de dag specificeren, zelfs als de kolom is gedeclareerd als TIMESTAMP (4) of TIMESTAMP (2). Anders wordt de waarde als ongeldig beschouwd en wordt 0 opgeslagen.
  2. Als u de ALTER-tabel gebruikt om een ​​TIMESTAMP-kolom uit te vouwen, wordt informatie die eerder verborgen was, gemarkeerd.
  3. Evenzo gaat er bij het verkleinen van een TIMESTAMP-kolom geen informatie verloren, behalve in de zin dat er minder informatie wordt weergegeven dan voorheen.
  4. Hoewel TIMESTAMP-kolommen met volledige precisie worden opgeslagen, is UNIX_TIMESTAMP () de enige functie die werkt met de volledige hoeveelheid informatie die erin is opgeslagen. Alle andere functies werken op de geformatteerde opgehaalde waarde. Dit betekent dat u een functie zoals HOUR () of SECOND () niet kunt gebruiken tenzij het corresponderende deel is opgenomen in de opgemaakte kolomwaarde. Het HH-gedeelte van een TIMESTAMP-kolom wordt bijvoorbeeld niet weergegeven tenzij de weergegeven breedte ten minste 10 is, dus het gebruik van HOURO voor kortere TIMESTAMP-waarden zou zinloos zijn.
TIMESTAMP-eigenschappen in MySQL 4.1 en hoger
Vanaf MySQL 4.1 zijn de TIMESTAMP-eigenschappen anders dan die in eerdere releases: TIMESTAMP-kolommen worden weergegeven in hetzelfde formaat als DATETIME-kolommen.
  • De weergavebreedte wordt niet langer ondersteund zoals eerder beschreven. Met andere woorden, u kunt TIMESTAMP (4) of TIMESTAMP (2) niet meer gebruiken. Bovendien, als de MySQL-server in MAXDB-modus draait, is het TIMESTAMP-type identiek aan datetime. Dat wil zeggen, als de server in MAXDB-modus draait wanneer de tabel wordt gemaakt, worden alle TIMESTAMP-kolommen gemaakt als DATETIME. Als gevolg hiervan gebruiken deze kolommen de DATETIME-weergave-indeling, hebben ze hetzelfde bereik van geldige waarden en worden ze niet automatisch bijgewerkt.
MySQL-server kan worden gestart in MAXDB-modus vanaf versie 4.1.1. Om deze modus in te schakelen, geeft u de optie -sql-mode = MAXDB op bij het starten van de server, of stelt u de waarde van de globale variabele sqljnode tijdens runtime in:
mysql STEL GLOBAAL in sql_mode = MAXDB;
De client kan de server dwingen om voor zijn eigen sessie in MAXDB-modus te draaien met behulp van de opdracht:
mysql SET SESSIE sql_mode = MAXDB; datum- en tijdgegevenstypen: DATUMTIJD, DATUM, TIJDSTEMPEL, TIJD en JAAR. Elk heeft een reeks geldige waarden, evenals een waarde van "nul", die wordt gebruikt wanneer de gebruiker een echt ongeldige waarde invoert. Merk op dat u met MySQL enkele niet geheel betrouwbare datumwaarden kunt opslaan, zoals 1999-11-31. Het is namelijk de verantwoordelijkheid van de toepassing, niet de SQL-servers, om de datumvalidatie te beheren. Om de datumvalidatie te versnellen, controleert MySQL alleen of de maand tussen 0-12 ligt en de dag tussen 0-31. Deze intervallen beginnen bij 0, dit wordt gedaan om MySQL de mogelijkheid te bieden om in de DATE- of DATETIME-kolommen datums op te slaan waarin de dag of maand nul is. Deze functie is vooral handig voor toepassingen die de geboortedatum opslaan - de geboortedag of -maand is hier niet altijd bekend. In dergelijke gevallen wordt de datum gewoon opgeslagen als 1999-00-00 of 1999-01-00 (en u moet niet vertrouwen op DATE_SUB () of DATE_ADD om de juiste waarden voor dergelijke datums te produceren).

MySQL haalt waarden voor een bepaald datum- of tijdtype alleen op in een standaardformaat, maar probeert tegelijkertijd een verscheidenheid aan formaten te interpreteren die van gebruikers kunnen komen (bijvoorbeeld bij het specificeren van een waarde waaraan een datum of tijdtype of vergelijk met een waarde die een van deze typen heeft). Alleen de indelingen die in de volgende secties worden beschreven, worden echter ondersteund. Er wordt van uitgegaan dat de gebruiker geldige waarden voor de hoeveelheden invoert, omdat het gebruik van hoeveelheden in andere formaten onvoorspelbare resultaten kan opleveren.

  • Hoewel MySQL probeert waarden in verschillende formaten te interpreteren, wordt in alle gevallen verwacht dat het meest linkse gedeelte van de datumwaarde met daarin het jaartal wordt verwacht. Datums moeten in de volgorde jaar-maand-dag staan ​​(bijvoorbeeld "98-09-04"), niet in de volgorde maand-dag-jaar of dag-maand-jaar, dwz. niet zoals we ze gewoonlijk schrijven (bijv. "09-04-98", "04-09-98").
  • MySQL converteert automatisch een datum- of tijdwaarde naar een getal wanneer de waarde in een numerieke context wordt gebruikt, en vice versa.
  • Een waarde van een datum- of tijdtype dat buiten het opgegeven interval valt of ongeldig is voor dit gegevenstype (zie het begin van deze sectie) wordt geconverteerd naar de waarde "nul" voor dit type. (Een uitzondering zijn de waarden van het type TIME die buiten het opgegeven interval liggen, die worden afgekapt tot het overeenkomstige grenspunt van het opgegeven TIME-interval). Tabel 4.3. de formaten voor de waarde "nul" worden weergegeven voor elk van de kolomtypen:
  • Nulwaarden zijn bijzonder. Om ze op te slaan of ernaar te verwijzen, kunt u expliciet de waarden in de tabel gebruiken, of u kunt "0" gebruiken, wat gemakkelijker te schrijven is.
DATETIME, DATE en TIMESTAMP Gegevenstypen

Het datatype DATETIME wordt gebruikt voor waarden die zowel datum- als tijdinformatie bevatten. MySQL haalt DATETIME-waarden op en drukt ze af in de indeling "JJJJ-MM-DD HH: MM: SS". Het ondersteunde bereik loopt van "1000-01-01 00:00:00" tot "9999-12-31 23:59:59". ("Ondersteund" betekent dat hoewel waarden met eerdere tijden ook kunnen werken, er geen garantie is dat ze correct worden opgeslagen en weergegeven).

Het DATE-type wordt gebruikt voor waarden met alleen datuminformatie, zonder het tijdgedeelte. MySQL haalt DATE-waarden op en geeft ze weer in de indeling "JJJJ-MM-DD". Het ondersteunde waardenbereik loopt van "1000-01-01" tot "9999-12-31".

Het kolomtype TIMESTAMP biedt een gegevenspresentatietype dat kan worden gebruikt om automatisch de huidige datum en tijd vast te leggen bij het uitvoeren van INSERT- of UPDATE-bewerkingen. Als er meerdere TIMESTAMP-kolommen zijn, wordt alleen de eerste automatisch bijgewerkt.

Voor andere (behalve de eerste) kolommen van het type TIMESTAMP kunt u de waarde ook instellen op de huidige datum en tijd. Om dit te doen, hoeft u alleen de kolom in te stellen op NULL of op NU ().

Elke TIMESTAMP-kolom (zelfs de eerste kolom van dit type) kan worden ingesteld op een andere waarde dan de huidige datum en tijd. Dit doet u door deze expliciet op de gewenste waarde in te stellen. U kunt deze eigenschap bijvoorbeeld gebruiken als u een TIMESTAMP-kolom wilt instellen op de huidige datum en tijd wanneer u een rij maakt, en als u die rij later bijwerkt, mag de kolomwaarde niet veranderen.

TIMESTAMP-waarden kunnen variëren van begin 1970 tot een bepaalde waarde in 2037, met een resolutie van één seconde. Deze waarden worden weergegeven als numerieke waarden.

Het gegevensformaat waarin MySQL TIMESTAMP-waarden ophaalt en weergeeft, is afhankelijk van het aantal weergegeven tekens. Dit wordt geïllustreerd in tabel 4.4. Het volledige TIMESTAMP-formaat is 14 decimalen, maar u kunt TIMESTAMP-kolommen maken met een kortere uitvoerregel:

Tabel 4.4. TIMESTAMP-gegevensformaat afhankelijk van het aantal geëxtraheerde bits
Kolomtype Uitvoerformaat
TIJDSTEMPEL (14) JJJJMMDDHHMMSS
TIJDSTEMPEL (12) JJMMDDHHMMSS
TIJDSTEMPEL (10) JJMMDDHHMM
TIJDSTEMPEL (8) JJJJMMDD
TIJDSTEMPEL (6) JJMMDD
TIJDSTEMPEL (4) JJMM
TIJDSTEMPEL (2) YY

De DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven in elke standaardset van formaten:

  • Als string in het formaat "JJJJ-MM-DD UU: MM: SS" of in het formaat "JJ-MM-DD HH: MM: SS". Toegestane "lichtgewicht" syntaxis - u kunt elk leesteken gebruiken als scheidingsteken tussen delen van een datum- of tijdsectie. Bijvoorbeeld de waarden "98-12-31 11:30:45", "98.12.31 11 + 30 + 45", "98/12/31 11 * 30 * 45" en " [e-mail beveiligd]@ 31 11 ^ 30 ^ 45 "zijn equivalent.
  • Als string in het formaat "JJJJ-MM-DD" of in het formaat "JJ-MM-DD". "Lichtgewicht" syntaxis is hier ook toegestaan. Bijvoorbeeld de waarden "98-12-31", "98.12.31", "98/12/31" en " [e-mail beveiligd]@ 31 "zijn gelijkwaardig.
  • Als string zonder scheidingstekens in het formaat "YYYYMMDDHHMMSS" of in het formaat "YYMMDDHHMMSS", op voorwaarde dat de string als een datum wordt beschouwd. De waarden "19970523091528" en "970523091528" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23 09:15:28", maar de waarde "971122129015" is ongeldig (de waarde voor het minutengedeelte is absurd) en wordt geconverteerd naar "0000-00-00 00 : 00: 00 ".
  • Als een tekenreeks zonder scheidingstekens in het formaat "JJJJMMDD" of in het formaat "JJMMDD", op voorwaarde dat de tekenreeks wordt geïnterpreteerd als een datum. De waarden "19970523" en "970523" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23", maar de waarde "971332" is ongeldig (de waarden voor de maand- en dagsecties zijn betekenisloos) en is geconverteerd naar "0000-00-00".
  • Als een getal in JJJJMMDDHHMMSS-formaat of JJMMDDHHMMSS-formaat, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905132800 en 830905132800 worden bijvoorbeeld geïnterpreteerd als "1983-09-05 13:28:00".
  • Als een getal in de indeling JJJJMMDD of JJMMDD, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905 en 830905 worden bijvoorbeeld geïnterpreteerd als "1983-09-05".
  • Als resultaat van het uitvoeren van een functie die een waarde retourneert die acceptabel is in contexten van de gegevenstypen DATETIME, DATE of TIMESTAMP (bijvoorbeeld de functie NOW () of CURRENT_DATE ()).
TIME gegevenstype

MySQL haalt TIME-waarden op en drukt ze af in het formaat "HH: MM: SS" (of formaat "HHH: MM: SS" voor grotere uren). TIME-waarden kunnen variëren van "-838: 59: 59" tot "838: 59: 59". De reden dat het "uur"-gedeelte van een waarde zo groot kan zijn, is dat het type TIME niet alleen kan worden gebruikt om de tijd van de dag weer te geven (die minder dan 24 uur moet zijn), maar ook om de totale verstreken tijd of de tijdsinterval tussen twee gebeurtenissen (die aanzienlijk langer dan 24 uur of zelfs negatief kunnen zijn).

TIME-waarden kunnen in verschillende formaten worden opgegeven:

Als een string in het formaat "D HH: MM: SS. Fractionele deel" (merk op dat MySQL nog niet voorziet in opslag van het fractionele deel van een waarde in een kolom van het type in kwestie). U kunt ook een van de volgende "lichtgewicht" weergaven gebruiken: HH: MM: SS Fractioneel deel, HH: MM: SS, HH: MM, D HH: MM: SS, D HH: MM, D HH of SS. Hier is D dagen uit het waardenbereik 0-33.

  • Als een niet-gescheiden tekenreeks in "HHMMSS"-indeling, op voorwaarde dat de tekenreeks wordt geïnterpreteerd als een datum. Zo wordt onder de waarde "101112" verstaan ​​"10:11:12", maar de waarde "109712" is ongeldig (de waarde voor de minuutsectie is absurd) en wordt omgezet in "00:00:00" .
  • Als een getal in HMMMSS-formaat, op voorwaarde dat de string wordt geïnterpreteerd als een datum. De waarde 101112 wordt bijvoorbeeld begrepen als "10:11:12". MySQL kent ook de volgende alternatieve formaten: SS
  • Als een viercijferig nummer variërend van 1901 tot 2155.
  • Als een tweecijferige tekenreeks van "00" tot "99". Waarden in het bereik "00" tot "69" en van "70" tot "99" worden geconverteerd naar JAAR-waarden in het bereik van respectievelijk 2000 tot 2069 en van 1970 tot 1999.
  • Als een tweecijferig getal in het bereik van 1 tot 99. Waarden in het bereik van 1 tot 69 en 70 tot 99 worden geconverteerd naar JAAR-waarden in het bereik van respectievelijk 2001 tot 2069 en 1970 tot 1999. Houd er rekening mee dat de spatiëring voor tweecijferige getallen en tweecijferige tekenreeksen iets anders is, aangezien u "nul" niet rechtstreeks als een getal kunt specificeren en het als 2000 kunt interpreteren. U moet het specificeren als de tekenreeks "0" of "00" , of het wordt geïnterpreteerd als 0000.
  • Als resultaat van het uitvoeren van een functie die een waarde retourneert die acceptabel is in de context van een JAAR-gegevenstype (zoals NU ()).

Ongeldige JAAR-waarden worden geconverteerd naar 0000.

De typen DATETIME, DATE en TIMESTAMP zijn gerelateerde gegevenstypen. Deze sectie beschrijft hun eigenschappen, gemeenschappelijke kenmerken en verschillen.

Het datatype DATETIME wordt gebruikt voor waarden die zowel datum- als tijdinformatie bevatten. MySQL haalt DATETIME-waarden op en drukt ze af in de indeling "JJJJ-MM-DD HH: MM: SS". Het ondersteunde bereik loopt van "1000-01-01 00:00:00" tot "9999-12-31 23:59:59". ("" ondersteund "" betekent dat hoewel waarden met eerdere tijden ook kunnen werken, er geen garantie is dat ze correct worden opgeslagen en weergegeven).

Het DATE-type wordt gebruikt voor waarden met alleen datuminformatie, zonder het tijdgedeelte. MySQL haalt DATE-waarden op en geeft ze weer in de indeling "JJJJ-MM-DD". Het ondersteunde waardenbereik loopt van "1000-01-01" tot "9999-12-31".

Het kolomtype TIMESTAMP biedt een gegevenspresentatietype dat kan worden gebruikt om automatisch de huidige datum en tijd vast te leggen bij het uitvoeren van INSERT- of UPDATE-bewerkingen. Als er meerdere TIMESTAMP-kolommen zijn, wordt alleen de eerste automatisch bijgewerkt.

De eerste TIMESTAMP-kolom wordt automatisch bijgewerkt wanneer aan een van de volgende voorwaarden wordt voldaan:

  • De kolom is niet expliciet gespecificeerd in een INSERT- of LOAD DATA INFILE-opdracht.
  • De kolom is niet expliciet gespecificeerd in de UPDATE-opdracht, en dit verandert een waarde in een andere kolom (merk op dat een UPDATE-opdracht die een kolom instelt op dezelfde waarde als vóór de opdracht, de TIMESTAMP-kolom niet zal bijwerken, omdat om prestatieredenen MySQL negeert dergelijke updates bij het instellen van een kolom op de huidige waarde).
  • De waarde in de kolom TIMESTAMP is expliciet ingesteld op NULL.

Voor andere (behalve de eerste) kolommen van het type TIMESTAMP kunt u de waarde ook instellen op de huidige datum en tijd. Om dit te doen, hoeft u alleen de kolom in te stellen op NULL of op NU ().

Elke TIMESTAMP-kolom (zelfs de eerste kolom van dit type) kan worden ingesteld op een andere waarde dan de huidige datum en tijd. Dit doet u door deze expliciet op de gewenste waarde in te stellen. Deze eigenschap kan bijvoorbeeld worden gebruikt als u de kolom TIMESTAMP moet instellen op de huidige datum en tijd wanneer u een rij maakt, en wanneer de rij vervolgens wordt bijgewerkt, mag de kolomwaarde niet veranderen:

  • Laat MySQL automatisch de waarde van de TIMESTAMP-kolom instellen wanneer de gegeven rij wordt gemaakt. De kolom wordt geïnitialiseerd met de huidige datum en tijd.
  • Wanneer u latere updates maakt voor andere kolommen in deze rij, moet u de TIMESTAMP-kolom expliciet instellen op de huidige waarde.

Aan de andere kant is het misschien gemakkelijker om de DATETIME-kolom voor dit doel te gebruiken. Wanneer een rij is gemaakt, moet deze worden geïnitialiseerd met de functie NU () en alleen worden gelaten voor latere updates.

TIMESTAMP-waarden kunnen variëren van begin 1970 tot een bepaalde waarde in 2037, met een resolutie van één seconde. Deze waarden worden weergegeven als numerieke waarden.

Het gegevensformaat waarin MySQL TIMESTAMP-waarden ophaalt en weergeeft, is afhankelijk van het aantal weergegeven tekens. Dit wordt geïllustreerd in de onderstaande tabel. Het volledige TIMESTAMP-formaat is 14 decimalen, maar u kunt TIMESTAMP-kolommen maken met een kortere uitvoerregel:

Ongeacht de grootte van de uitvoerwaarde, is de grootte van de gegevens die zijn opgeslagen in de TIMESTAMP-kolommen altijd hetzelfde. Het meest gebruikte uitvoerformaat is 6, 8, 12 of 14 decimalen. Bij het maken van een tabel kunt u een willekeurige grootte van de weergegeven waarden opgeven, maar als deze grootte is ingesteld op 0 of groter dan 14, wordt de waarde 14 gebruikt. Oneven groottewaarden in het bereik van 1 tot 13 wordt teruggebracht tot het dichtstbijzijnde grotere even getal.

De DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven in elke standaardset van formaten:

  • Als string in het formaat "JJJJ-MM-DD UU: MM: SS" of in het formaat "JJ-MM-DD HH: MM: SS". Toegestane "lichtgewicht" "syntaxis - u kunt elk leesteken gebruiken als scheidingsteken tussen delen van een datum- of tijdsectie. Bijvoorbeeld de waarden "98-12-31 11:30:45", "98.12.31 11 + 30 + 45", "98/12/31 11 * 30 * 45" en " [e-mail beveiligd]@ 31 11 ^ 30 ^ 45 "zijn equivalent.
  • Als string in het formaat "JJJJ-MM-DD" of in het formaat "JJ-MM-DD". Lichtgewicht syntaxis is hier ook toegestaan. Bijvoorbeeld de waarden "98-12-31", "98.12.31", "98/12/31" en " [e-mail beveiligd]@ 31 "zijn gelijkwaardig.
  • Als string zonder scheidingstekens in het formaat "YYYYMMDDHHMMSS" of in het formaat "YYMMDDHHMMSS", op voorwaarde dat de string als een datum wordt beschouwd. De waarden "19970523091528" en "970523091528" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23 09:15:28", maar de waarde "971122129015" is ongeldig (de waarde voor het minutengedeelte is absurd) en wordt geconverteerd naar "0000-00-00 00 : 00: 00 ".
  • Als een tekenreeks zonder scheidingstekens in het formaat "JJJJMMDD" of in het formaat "JJMMDD", op voorwaarde dat de tekenreeks wordt geïnterpreteerd als een datum. De waarden "19970523" en "970523" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23", maar de waarde "971332" is ongeldig (de waarden voor de maand- en dagsecties zijn betekenisloos) en is geconverteerd naar "0000-00-00".
  • Als een getal in JJJJMMDDHHMMSS-formaat of JJMMDDHHMMSS-formaat, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905132800 en 830905132800 worden bijvoorbeeld geïnterpreteerd als "1983-09-05 13:28:00".
  • Als een getal in de indeling JJJJMMDD of JJMMDD, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905 en 830905 worden bijvoorbeeld geïnterpreteerd als "1983-09-05".
  • Als resultaat van het uitvoeren van een functie die een waarde retourneert die acceptabel is in contexten van het gegevenstype DATETIME, DATE of TIMESTAMP (bijvoorbeeld de functie NOW () of CURRENT_DATE).

Ongeldige waarden voor DATETIME, DATE of T IMESTAMP worden geconverteerd naar nul "" voor het juiste waardetype ("0000-00-00 00:00:00", "0000-00-00" of 00000000000000).

Voor waarden die worden weergegeven als tekenreeksen met scheidingstekens tussen delen van de datum, hoeft u geen twee cijfers op te geven voor maand- of dagwaarden kleiner dan 10. De waarde "1979-6-9" is dus gelijk aan de waarde "1979-06-09". Evenzo is het voor waarden die worden weergegeven als tekenreeksen die scheidingstekens bevatten binnen de tijdaanduiding, niet nodig om twee cijfers op te geven voor uren, minuten of seconden minder dan 10. Dus,

Waarden gespecificeerd als getallen moeten 6, 8, 12 of 14 decimalen zijn. Een getal met 8 of 14 cijfers wordt verondersteld respectievelijk in de indeling JJJJMMDD of JJJJMMDDHHMMSS te zijn, met het jaar in de eerste vier cijfers. Als de lengte van het getal 6 of 12 cijfers is, wordt uitgegaan van de volgende notaties JJMMDD of JJMMDDHHMMSS, waarbij het jaartal wordt aangegeven in de eerste twee cijfers. Getallen met een lengte die niet overeenkomt met een van de beschreven opties, worden geïnterpreteerd als voorloopnullen tot de dichtstbijzijnde opgegeven lengte.

Waarden die worden weergegeven als strings zonder scheidingstekens worden geïnterpreteerd met betrekking tot hun lengte volgens de onderstaande regels. Als de tekenreeks 8 of 14 tekens lang is, wordt aangenomen dat het jaar wordt aangegeven door de eerste vier tekens. Anders wordt aangenomen dat het jaar wordt aangegeven door de eerste twee tekens. De tekenreeks wordt van links naar rechts geïnterpreteerd en definieert waarden voor het jaar, de maand, de dag, het uur, de minuut en de seconde voor alle secties in de tekenreeks. Dit betekent dat een string met een lengte van minder dan 6 karakters niet gebruikt kan worden. Als u bijvoorbeeld een tekenreeks als "9903" opgeeft, ervan uitgaande dat dit maart 1999 is, zal MySQL een "nul" "datum in de tabel invoeren. Het jaar en de maand in dit item zijn respectievelijk 99 en 03, maar de sectie die de dag vertegenwoordigt ontbreekt (de waarde is nul), dus in het algemeen is deze waarde geen geldige datumwaarde.

Bij het opslaan van geldige waarden in TIMESTAMP-kolommen, wordt de volledige precisie gebruikt die is opgegeven bij het specificeren ervan, ongeacht het aantal weergegeven tekens. Deze eigenschap heeft verschillende gevolgen:

  • U moet altijd het jaar, de maand en de dag opgeven, zelfs voor de typen TIMESTAMP (4) of TIMESTAMP (2). Anders is de opgegeven waarde geen geldige datumwaarde en wordt deze opgeslagen als 0.
  • Door de breedte van een smalle TIMESTAMP-kolom te vergroten met behulp van de ALTER TABLE-opdracht, wordt de eerder "verborgen" "informatie weergegeven.
  • Evenzo zal het verkleinen van de TIMESTAMP-kolom de opgeslagen informatie niet verliezen, tenzij u er rekening mee houdt dat er minder informatie wordt uitgevoerd bij het uitvoeren.
  • Hoewel TIMESTAMP-waarden met volledige precisie worden opgeslagen, kan alleen de functie UNIX_TIMESTAMP () rechtstreeks werken met deze oorspronkelijke opgeslagen waarde. De rest van de functies werken op de geformatteerde waarden van de geëxtraheerde waarde. Dit betekent dat u geen functies zoals HOUR () of SECOND () kunt gebruiken tenzij het corresponderende deel van de TIMESTAMP-waarde is opgenomen in de opgemaakte waarde. Het HH-gedeelte van de TIMESTAMP-kolom wordt bijvoorbeeld niet uitgevoerd totdat het aantal tekens dat wordt uitgevoerd ten minste 10 is, dus het is zinloos om HOUR () te gebruiken voor kortere TIMESTAMP-waarden.

Waarden van het ene type datum kunnen in sommige gevallen worden toegekend aan een object van een ander type datum. In dit geval is echter enige waardeverandering of verlies van informatie mogelijk:

  • Als u een DATE-waarde toewijst aan een DATETIME- of TIMESTAMP-object, stelt de resulterende waarde het "time"-gedeelte in op "00:00:00", aangezien de DATE-waarde geen tijdinformatie bevat.
  • Als u een waarde van het type DATE, DATETIME of TIMESTAMP toewijst aan een DATE-object, wordt het "tijdelijke" gedeelte in de resulterende waarde verwijderd, aangezien het DATE-type geen tijdinformatie bevat.
  • Hoewel alle DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven met dezelfde set indelingen, moet u er rekening mee houden dat de opgegeven typen verschillende reeksen geldige waarden hebben. TIMESTAMP-waarden kunnen bijvoorbeeld geen datumwaarden hebben die eerder zijn dan 1970 of later dan 2037. Dit betekent dat een datum zoals "1968-01-01", hoewel toegestaan ​​voor een DATETIME- of DATE-waarde, ongeldig is voor een TIMESTAMP-waarde en wordt geconverteerd naar 0 wanneer deze aan dit object wordt toegewezen.

Houd bij het instellen van datumwaarden rekening met enkele valkuilen:

  • Het vereenvoudigde formaat dat is toegestaan ​​voor stringwaarden kan verwarrend zijn. Een waarde als "10:11:12" kan bijvoorbeeld een tijdswaarde zijn vanwege het `:'-scheidingsteken, maar bij gebruik in een datumcontext zou het worden geïnterpreteerd als het jaar "2010-11-12". "10:45:15" wordt geconverteerd naar "0000-00-00" omdat "45" niet geldig is voor de maand.
  • MySQL-server voert alleen de primaire datumvalidatie uit: dagen 00-31, maanden 00-12, jaren 1000-9999. Elke datum buiten dit bereik wordt geconverteerd naar 0000-00-00. Opgemerkt moet worden dat het echter niet verboden is om ongeldige datums op te slaan, zoals 2002-04-31. Hierdoor kunnen webapplicaties formuliergegevens behouden zonder aanvullende validatie. Om er zeker van te zijn dat de datum geldig is, wordt er een controle uitgevoerd in de applicatie zelf.
  • De waarden van het jaar, weergegeven door twee cijfers, zijn onderhevig aan dubbelzinnige interpretatie, aangezien de eeuw onbekend is. MySQL interpreteert jaarwaarden van twee cijfers volgens de volgende regels:
    • Jaarwaarden in het bereik 00-69 worden geconverteerd naar 2000-2069.
    • Jaren in het bereik van 70-99 worden omgerekend naar 1970-1999.

De typen DATETIME, DATE en TIMESTAMP zijn gerelateerde gegevenstypen. Deze sectie beschrijft hun eigenschappen, gemeenschappelijke kenmerken en verschillen.

Het datatype DATETIME wordt gebruikt voor waarden die zowel datum- als tijdinformatie bevatten. MySQL haalt DATETIME-waarden op en drukt ze af in de indeling "JJJJ-MM-DD HH: MM: SS". Het ondersteunde bereik loopt van "1000-01-01 00:00:00" tot "9999-12-31 23:59:59". ("" ondersteund "" betekent dat hoewel waarden met eerdere tijden ook kunnen werken, er geen garantie is dat ze correct worden opgeslagen en weergegeven).

Het DATE-type wordt gebruikt voor waarden met alleen datuminformatie, zonder het tijdgedeelte. MySQL haalt DATE-waarden op en geeft ze weer in de indeling "JJJJ-MM-DD". Het ondersteunde waardenbereik loopt van "1000-01-01" tot "9999-12-31".

Het kolomtype TIMESTAMP biedt een gegevenspresentatietype dat kan worden gebruikt om automatisch de huidige datum en tijd vast te leggen bij het uitvoeren van INSERT- of UPDATE-bewerkingen. Als er meerdere TIMESTAMP-kolommen zijn, wordt alleen de eerste automatisch bijgewerkt.

De eerste TIMESTAMP-kolom wordt automatisch bijgewerkt wanneer aan een van de volgende voorwaarden wordt voldaan:

  • De kolom is niet expliciet gespecificeerd in een INSERT- of LOAD DATA INFILE-opdracht.
  • De kolom is niet expliciet gespecificeerd in de UPDATE-opdracht, en dit verandert de waarde in een andere kolom (merk op dat een UPDATE-opdracht die een kolom instelt op dezelfde waarde als voordat de opdracht werd uitgevoerd, de TIMESTAMP-kolom niet zal bijwerken, omdat om prestatieredenen negeert MySQL dergelijke updates bij het instellen van een kolom op de huidige waarde).
  • De waarde in de kolom TIMESTAMP is expliciet ingesteld op NULL.

Voor andere (behalve de eerste) kolommen van het type TIMESTAMP kunt u de waarde ook instellen op de huidige datum en tijd. Om dit te doen, hoeft u alleen de kolom in te stellen op NULL of op NU ().

Elke TIMESTAMP-kolom (zelfs de eerste kolom van dit type) kan worden ingesteld op een andere waarde dan de huidige datum en tijd. Dit wordt gedaan door deze expliciet op de gewenste waarde in te stellen. Deze eigenschap kan bijvoorbeeld worden gebruikt als u de kolom TIMESTAMP moet instellen op de huidige datum en tijd wanneer u een rij maakt, en wanneer de rij vervolgens wordt bijgewerkt, mag de kolomwaarde niet veranderen:

  • Laat MySQL automatisch de waarde van de TIMESTAMP-kolom instellen wanneer de gegeven rij wordt gemaakt. De kolom wordt geïnitialiseerd met de huidige datum en tijd.
  • Wanneer u latere updates maakt voor andere kolommen in deze rij, moet u de TIMESTAMP-kolom expliciet instellen op de huidige waarde.

Aan de andere kant is het misschien gemakkelijker om de DATETIME-kolom voor dit doel te gebruiken. Wanneer een rij is gemaakt, moet deze worden geïnitialiseerd met de functie NU () en alleen worden gelaten voor latere updates.

TIMESTAMP-waarden kunnen variëren van begin 1970 tot een bepaalde waarde in 2037, met een resolutie van één seconde. Deze waarden worden weergegeven als numerieke waarden.

Het gegevensformaat waarin MySQL TIMESTAMP-waarden ophaalt en weergeeft, is afhankelijk van het aantal weergegeven tekens. Dit wordt geïllustreerd in de onderstaande tabel. Het volledige TIMESTAMP-formaat is 14 decimalen, maar u kunt TIMESTAMP-kolommen maken met een kortere uitvoerregel:

Kolomtype Uitvoerformaat
TIJDSTEMPEL (14)JJJJMMDDHHMMSS
TIJDSTEMPEL (12)JJMMDDHHMMSS
TIJDSTEMPEL (10)JJMMDDHHMM
TIJDSTEMPEL (8)JJJJMMDD
TIJDSTEMPEL (6)JJMMDD
TIJDSTEMPEL (4)JJMM
TIJDSTEMPEL (2)YY

Ongeacht de grootte van de uitvoerwaarde, is de grootte van de gegevens die zijn opgeslagen in de TIMESTAMP-kolommen altijd hetzelfde. Het meest gebruikte uitvoerformaat is 6, 8, 12 of 14 decimalen. Bij het maken van een tabel kunt u een willekeurige grootte van de weergegeven waarden opgeven, maar als deze grootte is ingesteld op 0 of groter dan 14, wordt de waarde 14 gebruikt. Oneven groottewaarden in het bereik van 1 tot 13 wordt teruggebracht tot het dichtstbijzijnde grotere even getal.

De DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven in elke standaardset van formaten:

  • Als string in het formaat "JJJJ-MM-DD UU: MM: SS" of in het formaat "JJ-MM-DD HH: MM: SS". De syntaxis "" lichtgewicht "" is toegestaan ​​- u kunt elk leesteken gebruiken als scheidingsteken tussen delen van een datum- of tijdsectie. Bijvoorbeeld de waarden "98-12-31 11:30:45", "98.12.31 11 + 30 + 45", "98/12/31 11 * 30 * 45" en " [e-mail beveiligd]@ 31 11 ^ 30 ^ 45 "zijn equivalent.
  • Als string in het formaat "JJJJ-MM-DD" of in het formaat "JJ-MM-DD". "Lightweight" "syntaxis is hier ook toegestaan. Bijvoorbeeld de waarden "98-12-31", "98.12.31", "98/12/31" en " [e-mail beveiligd]@ 31 "zijn gelijkwaardig.
  • Als string zonder scheidingstekens in het formaat "YYYYMMDDHHMMSS" of in het formaat "YYMMDDHHMMSS", op voorwaarde dat de string als een datum wordt beschouwd. De waarden "19970523091528" en "970523091528" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23 09:15:28", maar de waarde "971122129015" is ongeldig (de waarde voor het minutengedeelte is absurd) en wordt geconverteerd naar "0000-00-00 00 : 00: 00 ".
  • Als een tekenreeks zonder scheidingstekens in het formaat "JJJJMMDD" of in het formaat "JJMMDD", op voorwaarde dat de tekenreeks wordt geïnterpreteerd als een datum. De waarden "19970523" en "970523" kunnen bijvoorbeeld worden geïnterpreteerd als "1997-05-23", maar de waarde "971332" is ongeldig (de waarden voor de maand- en dagsecties zijn betekenisloos) en is geconverteerd naar "0000-00-00".
  • Als een getal in JJJJMMDDHHMMSS-formaat of JJMMDDHHMMSS-formaat, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905132800 en 830905132800 worden bijvoorbeeld geïnterpreteerd als "1983-09-05 13:28:00".
  • Als een getal in de indeling JJJJMMDD of JJMMDD, op voorwaarde dat het getal wordt geïnterpreteerd als een datum. 19830905 en 830905 worden bijvoorbeeld geïnterpreteerd als "1983-09-05".
  • Als resultaat van het uitvoeren van een functie die een waarde retourneert die acceptabel is in contexten van het gegevenstype DATETIME, DATE of TIMESTAMP (bijvoorbeeld de functie NOW () of CURRENT_DATE).

Ongeldige waarden voor DATETIME, DATE of T IMESTAMP worden geconverteerd naar "nul" "voor het juiste waardetype (" 0000-00-00 00:00:00 "," 0000-00-00 ", of 00000000000000).

Voor waarden die worden weergegeven als tekenreeksen met scheidingstekens tussen delen van de datum, hoeft u geen twee cijfers op te geven voor maand- of dagwaarden kleiner dan 10. De waarde "1979-6-9" is dus gelijk aan de waarde "1979-06-09". Evenzo is het voor waarden die worden weergegeven als tekenreeksen die scheidingstekens bevatten binnen de tijdaanduiding, niet nodig om twee cijfers op te geven voor uren, minuten of seconden minder dan 10. Dus,

Waarden gespecificeerd als getallen moeten 6, 8, 12 of 14 decimalen zijn. Een getal met 8 of 14 cijfers wordt verondersteld respectievelijk in de indeling JJJJMMDD of JJJJMMDDHHMMSS te zijn, met het jaar in de eerste vier cijfers. Als de lengte van het getal 6 of 12 cijfers is, wordt uitgegaan van de volgende notaties JJMMDD of JJMMDDHHMMSS, waarbij het jaartal wordt aangegeven in de eerste twee cijfers. Getallen met een lengte die niet overeenkomt met een van de beschreven opties, worden geïnterpreteerd als voorloopnullen tot de dichtstbijzijnde opgegeven lengte.

Waarden die worden weergegeven als strings zonder scheidingstekens worden geïnterpreteerd met betrekking tot hun lengte volgens de onderstaande regels. Als de tekenreeks 8 of 14 tekens lang is, wordt aangenomen dat het jaar wordt aangegeven door de eerste vier tekens. Anders wordt aangenomen dat het jaar wordt aangegeven door de eerste twee tekens. De tekenreeks wordt van links naar rechts geïnterpreteerd en definieert waarden voor het jaar, de maand, de dag, het uur, de minuut en de seconde voor alle secties in de tekenreeks. Dit betekent dat een string met een lengte van minder dan 6 karakters niet gebruikt kan worden. Als u bijvoorbeeld een tekenreeks als "9903" opgeeft, ervan uitgaande dat dit maart 1999 is, zal MySQL een "nul" "datum aan de tabel toevoegen. Het jaar en de maand in dit item zijn respectievelijk 99 en 03, maar de sectie die de dag vertegenwoordigt ontbreekt (de waarde is nul), dus in het algemeen is deze waarde geen geldige datumwaarde.

Bij het opslaan van geldige waarden in TIMESTAMP-kolommen, wordt de volledige precisie gebruikt die is opgegeven bij het specificeren ervan, ongeacht het aantal weergegeven tekens. Deze eigenschap heeft verschillende gevolgen:

  • U moet altijd het jaar, de maand en de dag opgeven, zelfs voor de typen TIMESTAMP (4) of TIMESTAMP (2). Anders is de opgegeven waarde geen geldige datumwaarde en wordt deze opgeslagen als 0.
  • Door de breedte van een smalle TIMESTAMP-kolom te vergroten met behulp van de ALTER TABLE-opdracht, wordt eerder "verborgen" informatie weergegeven.
  • Evenzo zal het verkleinen van de TIMESTAMP-kolom de opgeslagen informatie niet verliezen, tenzij u er rekening mee houdt dat er minder informatie wordt uitgevoerd bij het uitvoeren.
  • Hoewel TIMESTAMP-waarden met volledige precisie worden opgeslagen, kan alleen de functie UNIX_TIMESTAMP () rechtstreeks werken met deze oorspronkelijke opgeslagen waarde. De rest van de functies werken op de geformatteerde waarden van de geëxtraheerde waarde. Dit betekent dat u geen functies zoals HOUR () of SECOND () kunt gebruiken tenzij het corresponderende deel van de TIMESTAMP-waarde is opgenomen in de opgemaakte waarde. Het HH-gedeelte van de TIMESTAMP-kolom wordt bijvoorbeeld niet uitgevoerd totdat het aantal tekens dat wordt uitgevoerd ten minste 10 is, dus het is zinloos om HOUR () te gebruiken voor kortere TIMESTAMP-waarden.

Waarden van het ene type datum kunnen in sommige gevallen worden toegekend aan een object van een ander type datum. In dit geval is echter enige waardeverandering of verlies van informatie mogelijk:

  • Als u een DATE-waarde toewijst aan een DATETIME- of TIMESTAMP-object, stelt de resulterende waarde het "time"-gedeelte in op "00:00:00" omdat de DATE-waarde geen tijdinformatie bevat.
  • Als u een waarde van het type DATE, DATETIME of TIMESTAMP toewijst aan een DATE-object, wordt het "" tijdelijke ""-gedeelte van de resulterende waarde verwijderd, aangezien het DATE-type geen tijdinformatie bevat.
  • Hoewel alle DATETIME-, DATE- en TIMESTAMP-waarden kunnen worden opgegeven met dezelfde set indelingen, moet u er rekening mee houden dat de opgegeven typen verschillende reeksen geldige waarden hebben. TIMESTAMP-waarden kunnen bijvoorbeeld geen datumwaarden hebben die eerder zijn dan 1970 of later dan 2037. Dit betekent dat een datum zoals "1968-01-01", hoewel toegestaan ​​voor een DATETIME- of DATE-waarde, ongeldig is voor een TIMESTAMP-waarde en wordt geconverteerd naar 0 wanneer deze aan dit object wordt toegewezen.

Houd bij het instellen van datumwaarden rekening met enkele "valkuilen":

  • Het vereenvoudigde formaat dat is toegestaan ​​voor stringwaarden kan verwarrend zijn. Een waarde zoals "10:11:12" kan bijvoorbeeld een tijdswaarde zijn vanwege het ":"-scheidingsteken, maar wanneer deze in de context van een datum wordt gebruikt, wordt deze geïnterpreteerd als het jaar "2010-11-12 ". Tegelijkertijd wordt de waarde "10:45:15" geconverteerd naar "0000-00-00", aangezien de waarde "45" niet geldig is voor de maand.
  • MySQL-server voert alleen de primaire datumvalidatie uit: dagen 00-31, maanden 00-12, jaren 1000-9999. Elke datum buiten dit bereik wordt geconverteerd naar 0000-00-00. Opgemerkt moet worden dat het echter niet verboden is om ongeldige datums op te slaan, zoals 2002-04-31. Hierdoor kunnen webapplicaties formuliergegevens behouden zonder aanvullende validatie. Om er zeker van te zijn dat de datum geldig is, wordt er een controle uitgevoerd in de applicatie zelf.
  • De waarden van het jaar, weergegeven door twee cijfers, zijn onderhevig aan dubbelzinnige interpretatie, aangezien de eeuw onbekend is. MySQL interpreteert jaarwaarden van twee cijfers volgens de volgende regels:
    • Jaarwaarden in het bereik 00-69 worden geconverteerd naar 2000-2069.
    • Jaren in het bereik van 70-99 worden omgerekend naar 1970-1999.


Als je nog vragen hebt of iets niet duidelijk is - welkom op onze