stukje text en maand/jaar opslaan
Ik wil in een database tabel 'foo' 2 dingen opslaan:
1. een description van wat 'foo' is. Dit zal een korte tekst zijn van een aantal regels. Nu wil ik graag weten hoeveel tekens ik kan opslaan in het TINYTEXT data type. Ik kan het niet terugvinden.
2. de maand en het jaar waarin 'foo' gemaakt is. Het lijkt me handig dat zodra ik een nieuwe 'foo' insert de huidige maand en jaar direct worden ingevoegd in de tabel. Echter, ik wil de maand en het jaar naderhand ook nog kunnen wijzigen (via een cms). Ik wil dus dat er op een pagina komt te staan: deze 'foo' is gemaakt in juni 2013. Hoe sla ik dit het beste op in de database, dusdanig dat ik de maand en het jaar naderhand vanuit een cms nog kan wijzigen (naar bijv. augustus 2013)?
Als je de rest wil hebben.
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
CHAR( ) fixed from 0 to 255 characters long
VARCHAR( ) variable from 0 to 255 characters long
TINYTEXT maximum length of 255 characters
TEXT maximum length of 65535 characters
BLOB maximum length of 65535 characters
MEDIUMTEXT maximum length of 16777215 characters
MEDIUMBLOB maximum length of 16777215 characters
LONGTEXT maximum length of 4294967295 characters
LONGBLOB maximum length of 4294967295 characters
VARCHAR( ) variable from 0 to 255 characters long
TINYTEXT maximum length of 255 characters
TEXT maximum length of 65535 characters
BLOB maximum length of 65535 characters
MEDIUMTEXT maximum length of 16777215 characters
MEDIUMBLOB maximum length of 16777215 characters
LONGTEXT maximum length of 4294967295 characters
LONGBLOB maximum length of 4294967295 characters
En als je de data wil weten.
Code (php)
1
2
3
4
2
3
4
TINYTEXT 256 bytes
TEXT 65,535 bytes ~64kb
MEDIUMTEXT 16,777,215 bytes ~16MB
LONGTEXT 4,294,967,295 bytes ~4GB
TEXT 65,535 bytes ~64kb
MEDIUMTEXT 16,777,215 bytes ~16MB
LONGTEXT 4,294,967,295 bytes ~4GB
Gewijzigd op 20/06/2013 15:48:38 door Chris PHP
Wel gelijk een andere vraag... wat is dan het verschil tussen varchar(255) en een tinytext?
Dit lijkt me het meest voor de hand liggende.
Iemand nog een idee over het opslaan van de datum (maand/jaar)?
Toevoeging op 20/06/2013 16:12:56:
Oh, da's maar weinig, 255 tekens voor een stukje tekst. Ik maar er een TEXT van.
Ozzie PHP op 20/06/2013 16:07:26:
Iemand nog een idee over het opslaan van de datum (maand/jaar)?
YEAR(4) voor het jaar en een TINYINT voor de maand. Maar liever nog een volledige datum, anders bouw je bij voorbaat al een onomkeerbaar dataverlies in.
En die volledige datum, wat is dan de beste optie? DATE, DATETIME of TIMESTAMP? Ik zie dat ik de timestamp automatisch kan invoegen dus dat lijkt me wel handig. Maar is TIMESTAMP dan ook de juiste optie van deze 3?
Vroeger kon je voor een automatische ON UPDATE CURRENT_TIMESTAMP per tabel maar één TIMESTAMP gebruiken. Op zich ook wel logisch: dat is de kolom waarmee je de laatste wijziging van een record registreert. Maar volgens mij kun je tegenwoordig zowel TIMESTAMP als DATETIME gebruiken.
(En is DATE hetzelfde als DATETIME, alleen dat je dan geen tijd erbij hebt? Dat zou in mijn geval dan toch ook nog kunnen?)
http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html
Een TIMESTAMP wordt intern geconverteerd naar de wereldstandaardtijd in UTC en is dús wereldwijd altijd nauwkeurig/uniek (tenzij de serverklok FUBAR is). Een DATETIME is een representatie van een datum plus een tijd die afhankelijk is van de lokale klok. Of kort door de bocht samengevat: de TIMESTAMP is een "echte computertijd" en de DATETIME meer een "string" die als datum en tijd wordt behandeld.
TIMESTAMP is een betere keuze voor een veld 'created', dat aangeeft wanneer een record is aangemaakt.
DATETIME is geschikt om een gekozen datum/tijd te geven, bv. de fuif begint om "2013-06-20 20:00:00"
Lijkt dit je terecht?
Wel de tijdzone in de databaseserverconfiguratie controleren, want die staat wel eens ten onrechte op bijvoorbeeld Berlijn in plaats van Amsterdam of Brussel.
Oh... hoe genereer ik in PHP gemakkelijk een timestamp (van het huidige moment) die ik in het databaseveld kan knippen/plakken?
Ozzie PHP op 20/06/2013 18:59:27:
Oké, dan lijkt een timestamp mij het meest "veilig" om te gebruiken. In mijn geval gaat het dus om de datum waarop iets gemaakt is. Hoe zou je het database veld dan noemen? Simpelweg 'timestamp' of 'creation_date'?
Liever nooit gereserveerde aanduidingen gebruiken, anders moet je aan de slag met backticks.
Ozzie PHP op 20/06/2013 18:59:27:
Oh... hoe genereer ik in PHP gemakkelijk een timestamp (van het huidige moment) die ik in het databaseveld kan knippen/plakken?
Dat gaat makkelijker met MySQL-functies en MySQL-standaardinstellingen, bijvoorbeeld NOW().
Ozzie PHP op 20/06/2013 18:59:27:
Hoe zou je het database veld dan noemen?
drupal noemt het created. Dat veld wordt niet veranderd.
Dan is er nog een extra veld modified, dat wel wordt aangepast telkens iets wordt geüpdated (node systeem).
om maar iets van inspiratie te geven.
----
Trouwens, ik bedoelde inderdaad ook meer, zoals ondertussen is aangehaald.
Soms wil je een datum/tijd echt onveranderd zien.
Neem nu als quiz-antwoord
Wanneer stopte WW1 ? "1918-11-11 11:11:00"
Hier is het absoluut niet relevant dat dit wordt aangepast aan de locatie van de server, of van de gebruiker.
Als je echter wil weten wanneer de live stream van het WK voetbal in Brazilië begint, is het wel relevant dat de gebruiker dit in zijn locale tijd kan krijgen.
Dat soort dingen zouden dus ook de keuze horen te beïnvloeden
Maar ik weet nu niet goed wat ik moet doen. Ik wil dus in de database zetten wanneer 'foo' is gemaakt. Gebruik ik dan TIMESTAMP of DATETIME / DATE? Uiteindelijk wil ik alleen de maand en het jaar weergeven.
In twijfelgevallen: de databaseserver instellen op de juiste tijdzone en een TIMESTAMP opslaan.
Hoe stel ik de database server in op de juiste tijd eigenlijk? Ik kan wel via een optie in mijn beheersysteem (WHM panel) de server tijd synchroniseren. Staat dan ook de database tijd meteen goed?
Maar waarom leg je je nu al vast op een "maandelijkse special"? Wat nu als je daarvan een "weekly special" wilt maken? Of een "dagaanbieding"?
Da's een keuze. Maar al zou het een weekly of dagaanbeiding worden, dan heb ik nog steeds geen tijdstip nodig. Dus de vraag blijft wat dan de beste optie is? Ik vind het ook prima om een timestamp te gebruiken als dat de beste optie is, maar wellicht neemt dat onnodig veel ruitme in beslag tov een DATE?
Dat je de dag of tijd vervolgens (nog) niet gebruikt, maakt niet veel uit, maar sluit nauwkeurigere functionaliteit ook niet bij voorbaat al uit.