Datatypen (MySQL)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Boolean

Datatypen bool, boolean en tinyint(1) zijn synoniem. Ik gebruik tinyint(1) voor Boolse waardes, met 0 voor niet waar en 1 voor waar. Dit zijn getallen (integers). Geen symbolische waardes of tekstwaardes.

A value of zero is considered false. Nonzero values are considered true:

mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false                  |
+------------------------+

mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true                   |
+------------------------+

However, the values TRUE and FALSE are merely aliases for 1 and 0, respectively, as shown here:

mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true                           |
+--------------------------------+

mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true                          |
+-------------------------------+

mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false                         |
+-------------------------------+

mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false                          |
+--------------------------------+

The last two statements display the results shown because 2 is equal to neither 1 nor 0. 

Conversion Rate

Een wisselkoers is duidelijk een decimal datatype:

  • Decimal(10,2) - Leuk begin, maar misschien te weinig cijfers voor de komma →
  • Decimal(10,4) - 6 cijfers voor de komma, 4 cijfers achter de komma - Amazon hanteert vier cijfers achter de komma
  • Op bankafschriften worden soms meer cijfers getoond, toch? ⇒ 4 Is voldoe
  • Momenteel is de zwakste valuta (zomer 2018), de Iraanse rial [1]. Op de zwarte markt is je euro zo'n 1,1 mln rial waard ⇒ Om een miljoen euro te kunnen weergeven in rial, heb je 12 cijfers voor de komma nodig ⇒ Niet nodig ⇒ decimal(10,4) is prima.

Datums

Bv.

alter table tmp

   add column date_window_begin   date,
   add column date_window_end     date;

update tmp
set
    date_window_begin=		"2016-08-09",
    date_window_end=		"2018-07-31";   # YYYY-MM-DD

Zie verder https://dev.mysql.com/doc/refman/5.7/en/date-and-time-types.html

Decimal

Ook voor geldbedragen en percentagen. Bv.

 decimal (5,2)    # 5 posities  - 3 voor de komma, 2 achter - Tot        999,99
 decimal (10,2)   # 10 posities - 8 voor de komma, 2 achter - Tot 99.999.999,99
 decimal (10,4)   # 10 posities - 6 voor de komma, 4 achter - Tot    999.999,9999

Geldbedragen

Standaard:

decimal(10,2)

Integere datatypes


  Kind          Storage   Signed                                                    Unsigned
  -----------   -------   -------------------------------------------------------   --------------------------------
* tinyint       1 byte    -128 to +127                                              0 to 255
* smallint      2 bytes   -32,768 to +32,767                                        0 to 65,535
* mediumint     3 bytes   -8,388,608 to 8,388,607                                   0 to 16,777,215
* int/integer   4 bytes   -2,147,483,648 to +2,147,483,647                          0 to 4,294,967,295
* bigint        8 bytes   -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807   0 to 18,446,744,073,709,551,615

Vaak (altijd?) kun je een waarde tussen haakjes meegeven, bv.

tinyint(4)

Dit verandert niets aan het datatype, maar alleen iets aan de weergave. Je kunt dus nog steeds geen waarde van 1234 toevoegen aan een tinyint(4), want het maximum is nog steeds 255 of 128.

Fixed-point datatypes

Fixed-point datatypes zijn voor exacte rationele getallen. Er wordt dus niet ergens afgerond ofzo

  • Keywords: DECIMAL & NUMERIC
  • Voor geldbedragen en gewichten gebruikte ik decimal (10,4) - 6 cijfers vóór de komma, 4 cijfers achter de komma, maar ik ben overgestapt op decimal (8,2) - Geen gedoe met extra cijfers achter de komma

Floating point-datatypes

longtext, mediumtext, tinytext, text

Veldlengtes [2] zijn gedefineerd in bytes en niet in het aantal karakters. Het aantal karakters waarmee dit overeenkomt, hangt af van de gekozen tekencodering. In de praktijk verschilt dit in Latin1 niet, en in UTF8 zo'n 10%:


      Type | Maximum length (bytes)               | Maximum length (characters, approx.) |
-----------+--------------------------------------+--------------------------------------+
  TINYTEXT |           255 (2 8−1) bytes          | 225 - 255                            |
      TEXT |        65,535 (216−1) bytes = 64 KiB | 59.000 - 65.535                      |
MEDIUMTEXT |    16,777,215 (224−1) bytes = 16 MiB | 14.3 mln - 16.777.215                |
  LONGTEXT | 4,294,967,295 (232−1) bytes =  4 GiB | 3.8 mld - 4,294,967,295              | 

mediumtext

  • MySQL gebruikt mediumtext regelmatig bij impliciete velddefinnities voor diverse vrij lange teksten die ik gebruik voor exportbestanden
  • Merk op dat mediumtext langer is dan text!

text

Max. 65.536 bytes. Voorbeeld:

ALTER TABLE `dwh`.`root` 
ADD COLUMN `note` text(65530) NULL AFTER `country_of_origin`;

Ik geloof dat je een text-veld niet kunt indexeren - Het lijkt wat dat betreft op een BLOB.

Percentages

Gebruik decimal [3] en sla percentages op als decimale breuk, bv.:

* 0,01% ⇒ 0.0001
* 1,26% ⇒ 0.0126
* 1%    ⇒ 0.01
* 10%   ⇒ 0.1
* 100%  ⇒ 1
* 1000% ⇒ 10

Nauwkeurigheid hangt af van zowel het aantal cijfers achter de komma, als voor de komma: Je bent immers niet beperkt tot 100%.

Voorbeeld(en):

 decimal (5,4)    # 5 posities - 1 voor de komma, 4 achter, bv. 1.26% tot 100%, bv. conversiepercentages
 decimal (10,6)   # 10 posities - 4 voor de komma, 6 achter de komma → Standaard bij importeren Amazon-rapportages in ''raw'' format

Tinyint

[-128:128] of [0:255]

Voorbeelden:

  • Gewicht koolborstels in grammen (afgerond op hele grammen)
  • Boolean: tinyint(1)

Let op: Je kunt een waarde tussen haakjes meegeven, bv.

tinyint(4)

Dit verandert niets aan het datatype, maar alleen iets aan de weergave. Je kunt dus nog steeds geen waarde van 1234 toevoegen aan een tinyint(4), want het maximum is nog steeds 255 of 128.

Tinytext vs. varchar

Zie dit ingewikkelde verhaal. Ik houd het op varchar

Valuta

Gebruik decimal. Bv.:

 decimal (5,2)    # 5 posities  - 3 voor de komma, 2 achter - Tot        999,99
 decimal (10,2)   # 10 posities - 8 voor de komma, 2 achter - Tot 99.999.999,99   ← Gebruik ik meestal
 decimal (10,4)   # 10 posities - 6 voor de komma, 4 achter - Tot    999.999,9999

Bronnen

dev.mysql.com

Tekst-formaten

Valuta

Overig