Welk MySQL-gegevenstype moet worden gebruikt voor het opslaan van booleaanse waarden

Aangezien MySQL geen ‘boolean’ gegevenstype lijkt te hebben, welk gegevenstype ‘misbruikt’ u dan voor het opslaan van waar/onwaar-informatie in MySQL?

Vooral in de context van het schrijven en lezen van/naar een PHP-script.

In de loop van de tijd heb ik verschillende benaderingen gebruikt en gezien:

  • tinyint, varchar-velden met de waarden 0/1,
  • varchar-velden met de tekenreeksen ‘0’/’1′ of ‘true’/’false’
  • en tot slot enum Velden die de twee opties ‘true’/’false’ bevatten.

Geen van bovenstaande lijkt optimaal. Ik geef de voorkeur aan de tinyint 0/1-variant, omdat automatische typeconversie in PHP me vrij eenvoudig booleaanse waarden geeft.

Welk gegevenstype gebruikt u? Is er een type ontworpen voor booleaanse waarden die ik over het hoofd heb gezien? Ziet u voordelen/nadelen bij het gebruik van een of ander type?


Antwoord 1, autoriteit 100%

Voor MySQL 5.0.3 en hoger kunt u BITgebruiken. De handleiding zegt:

Vanaf MySQL 5.0.3 wordt het BIT-gegevenstype gebruikt om bit-veld op te slaan
waarden. Een type BIT(M) maakt opslag van M-bit-waarden mogelijk. M kan bereik
van 1 tot 64.

Anders kunt u volgens de MySQL-handleiding BOOLof BOOLEANgebruiken, die momenteel aliassen zijn van tinyint(1):

Bool, Boolean: deze typen zijn synoniemen voor TINYINT(1). een waarde van
nul wordt als onwaar beschouwd. Niet-nul
waarden worden als waar beschouwd.

MySQL stelt ook dat:

We zijn van plan om volledige boolean te implementeren
type behandeling, in overeenstemming met:
standaard SQL, in een toekomstige MySQL
vrijgeven.

Referenties: http://dev.mysql. com/doc/refman/5.5/en/numeric-type-overview.html


Antwoord 2, autoriteit 20%

BOOLen BOOLEANzijn synoniemen van TINYINT(1). Nul is FALSE, al het andere is TRUE. Meer informatie hier.


Antwoord 3, autoriteit 6%

Dit is een elegante oplossing die ik erg op prijs stel omdat het nul databytes gebruikt:

some_flag CHAR(0) DEFAULT NULL

Als u het op true wilt instellen, stelt u some_flag = ''in en om het op false in te stellen, stelt u some_flag = NULLin.

Om vervolgens op true te testen, controleer of some_flag IS NOT NULL, en om te testen op false, controleer of some_flag IS NULL.

(Deze methode wordt beschreven in “High Performance MySQL: Optimization, Backups, Replication, and More” door Jon Warren Lentz, Baron Schwartz en Arjen Lentz.)


Antwoord 4, autoriteit 3%

Deze vraag is beantwoord, maar ik dacht dat ik mijn $ 0,02 erin zou gooien.
Ik gebruik vaak een CHAR(0), waarbij '' == true and NULL == false.

Van MySQL-documenten:

CHAR(0)is ook heel fijn als je een kolom nodig hebt die alleen kan duren
twee waarden: een kolom die is gedefinieerd als CHAR(0)NULLneemt slechts één
bit en kan alleen de waarden NULLen ''(de lege tekenreeks) aannemen.


Antwoord 5, autoriteit 3%

Als u het Boolean-type gebruikt, is dit aliass aan Tinyint (1). Dit is het beste als u gestandaardiseerde SQL wilt gebruiken en niet erg vindt dat het veld een buiten bereikwaarde kan bevatten (eigenlijk alles dat niet is 0).

ENUM (‘FALSE’, ‘TRUE’) laat je de snaren in je SQL gebruiken en MySQL zal het veld intern opslaan als een geheel getal waar ‘False’ = 0 en ‘TRUE’ is op basis van de bestelling ENUM is opgegeven.

In MySQL 5+ kunt u een bit (1) veld gebruiken om een ​​1-bit numeriek type aan te geven. Ik geloof niet dat dit eigenlijk elke minder ruimte in de opslag gebruikt, maar laat u opnieuw de mogelijke waarden op 1 of 0 beperken.

Al het bovenstaande gebruikt ongeveer dezelfde hoeveelheid opslag, dus het is het beste om degene te kiezen die u gemakkelijkst vindt om mee te werken.


Antwoord 6

Ik gebruik Tinyint (1) om Booleaanse waarden in MySQL op te slaan.

Ik weet niet of er een voordeel is om dit te gebruiken … maar als ik het niet fout heb, kan MySQL Boolean (Bool) opslaan en het opslaan als een Tinyint (1)

http: //dev.mySQL. COM / DOC / REFMAN / 5.0 / NL / ANDERE-VENDEREN-DATA-types.html


Antwoord 7

Bit is alleen voordelig over de verschillende byte-opties (Tinyint, Enum, Char (1)) als u veel Booleaanse velden hebt. Een beetje veld neemt nog steeds een volle byte in beslag. Twee bit velden passen in diezelfde byte. Drie, vier, vijf, zes, zeven, acht. Waarna ze de volgende byte beginnen te vullen. Uiteindelijk zijn de besparingen zo klein, er zijn duizenden andere optimalisaties waarmee je je moet concentreren. Tenzij u te maken hebt met een enorme hoeveelheid gegevens, gaan deze paar bytes niet veel toe. Als u bit met PHP gebruikt, moet u de waarden typen in en uit.


Antwoord 8

Totdat MySQL een bit-gegevenstype implementeert, als uw verwerking echt wordt ingedrukt voor ruimte en/of tijd, zoals bij transacties met een hoog volume, maakt u een TINYINT-veld met de naam bit_flagsvoor al uw booleaanse variabelen, en maskeer en verschuif het gewenste booleaanse bit in uw SQL-query.

Als uw meest linkse bit bijvoorbeeld uw bool-veld vertegenwoordigt en de 7 meest rechtse bits niets, dan is uw veld bit_flagsgelijk aan 128 (binair 10000000). Maskeer (verberg) de zeven meest rechtse bits (met behulp van de bitsgewijze operator &), en schuif het 8e bit zeven spaties naar rechts, eindigend met 00000001. Nu het volledige getal (dat in dit geval , is 1) is uw waarde.

SELECT (t.bit_flags & 128) >> 7 AS myBool FROM myTable t;
if bit_flags = 128 ==> 1 (true)
if bit_flags = 0 ==> 0 (false)

U kunt dergelijke instructies uitvoeren tijdens het testen

SELECT (128 & 128) >> 7;
SELECT (0 & 128) >> 7;

enz.

Omdat je 8 bits hebt, heb je potentieel 8 booleaanse variabelen van één byte. Een toekomstige programmeur zal steevast de volgende zeven bits gebruiken, dus je moetmaskeren. Verschuif niet zomaar, anders creëer je in de toekomst een hel voor jezelf en anderen. Zorg ervoor dat MySQL uw masking en shifting doet – dit zal aanzienlijk sneller zijn dan de webscriptingtaal (PHP, ASP, enz.) Het te laten doen. Zorg er ook voor dat u een opmerking plaatst in het MySQL-commentaarveld voor uw bit_flags-veld.

U zult deze sites handig vinden bij het implementeren van deze methode:


Antwoord 9

Ik was het zat om nullen, NULLS en ” nauwkeurig rond een lus van PHP-, MySql- en POST-waarden te krijgen, dus ik gebruik gewoon ‘Ja’ en ‘Nee’.

Dit werkt feilloos en heeft geen speciale behandeling nodig die niet voor de hand liggend en gemakkelijk te doen is.


Antwoord 10

Verwijzend naar deze link
Boolean datatype in Mysql, volgens de toepassingsgebruik, als men wil dat alleen 0 of 1 wordt opgeslagen, is bit(1) de betere keuze.


Antwoord 11

Sinds MySQL (8.0.16) en MariaDB (10.2.1) beide de CHECK-beperking hebben geïmplementeerd, zou ik nu gebruik maken van

bool_val TINYINT CHECK(bool_val IN(0,1))

U kunt alleen 0, 1of NULLopslaan, evenals waarden die kunnen worden geconverteerd naar 0of 1zonder fouten zoals '1', 0x00, b'1'of TRUE/FALSE.

Als u NULL’s niet wilt toestaan, voegt u de optie NOT NULLtoe

bool_val TINYINT NOT NULL CHECK(bool_val IN(0,1))

Merk op dat er vrijwel geen verschil is als u TINYINT, TINYINT(1)of TINYINT(123)gebruikt.

Als u wilt dat uw schema opwaarts compatibel is, kunt u ook BOOLof BOOLEAN

gebruiken

bool_val BOOL CHECK(bool_val IN(TRUE,FALSE))

db & lt; & gt; fiddle demo


Antwoord 12

Na het lezen van de antwoorden hier besloot ik bit(1)en ja te gebruiken, het is op de een of andere manier beter in de ruimte / tijd, maar Na een tijdje veranderde ik van gedachten en ik zal het nooit meer gebruiken. Het heeft mijn ontwikkeling veel ingewikkeld, bij het gebruik van bereide verklaringen, bibliotheken enz. (PHP).

Sindsdien gebruik ik altijd tinyint(1), lijkt goed genoeg.


Antwoord 13

U kunt BOOL, Booleaanse gegevenstype gebruiken voor het opslaan van Boolean-waarden.

Deze typen zijn Synoniemen voor Tinyint (1)

Het gegevenstype van het bit (1) is echter zinvol om een ​​Booleaanse waarde op te slaan (hetzij waar [1] of onwaar [0]) maar Tinyint (1) is gemakkelijker om mee te werken wanneer u de gegevens uitvoert, maar Querying enzovoort en om interoperabiliteit tussen MySQL en andere databases te bereiken. Je kunt ook controleren dit antwoord of draad .

MySQL converteert ook bool, Booleaanse gegevenstypen naar Tinyint (1).

Verder, lees Documentatie

Other episodes