Prawie wszystko o typie danych BIT w MySQL 8

Jednym z typów danych numerycznych w MySQL 8 jest typ BIT(M) . Służy on do przechowywania liczby całkowitej przekazanej w postaci bitowej lub liczby, o podanej ograniczonej liczbie bitów.


M w nawiasach oznacza maksymalną liczbę bitów, jaką możemy do kolumny tego typu przekazać. I tak BIT(5) oznacza, że możemy przechowywać wartość bitową złożoną z nie więcej niż 5 bitów. M może przyjmować wartości od 1 do 64. Domyślną wartością dla M jest 1, więc jeśli podasz typ danych tylko jako BIT, zostanie przydzielone miejsce na wartość tylko jedno bitową ,a więc 0 lub 1. Umożliwia to za pomocą typu danych BIT przedstawić wartość boolean: true oznacza 1, a false 0.

Aby do kolumny tego typu przekazać wartość należy ją przedstawić w apostrofach w postaci zer i jedynek i poprzedzić literą b lub B np. b' 1101' , B' 1110' lub przedstawić w postaci liczby całkowitej, gdyż typ BIT należy do kategorii typów numerycznych całkowitoliczbowych, albo podać zero i literę b (małą literę, bo B nie zadziała) i bez apostrofów wypisać ciąg zer i jedynek liczby ( 0b 1001 ).
Jeśli ustawisz kolumnę na BIT(4), a wprowadzisz wartość złożoną z mniej bitów np. B’101′, brakująca liczba bitów zostanie uzupełniona od lewej strony zerami, a więc w tym przypadku będzie to B’0101′ (zostanie na początku dodane jedno zero). W praktyce i tak tego nie zobaczymy, bo w tabeli zostanie wyświetlona liczba całkowita odpowiadająca przekazanej wartości bitowej.

Sprawdźmy jak typ danych BIT działa w praktyce. Otwórzmy konsolę MySQL Shell,
przejdźmy w tryb sql i połączmy się z serwerem MySQL:


Następnie za pomocą polecenia:
USE test;

łączymy się z bazą, u mnie z bazą test (polecenie CREATE DATABASE test; utworzy tą bazę):

Tworzymy w niej tabelę złożoną z tylko jednej kolumny o nazwie source typu BIT .
CREATE TABLE example(source BIT);

Następnie wstawimy do niej kilka wierszy danych.

INSERT INTO example VALUES(b'1');
INSERT INTO example VALUES(B'0');
INSERT INTO example VALUES(0b1);

Dane zostały wstawione bez błędów:

Za pomocą polecenia:

SELECT * FROM example;

wybieramy dane z tabeli.

A co jeśli dla typu BIT, domyślnie ograniczonego do 1 bitu, spróbujemy wstawić większą wartość:

INSERT INTO example VALUES(b'10');

Pojawił się błąd z informacją, że wstawiana wartość jest zbyt długa. Podobnie w przypadku próby wstawienia liczby 2 (zajmuje 2 bity, bo ma wartość: 10 ):

INSERT INTO example VALUES(2);

Ale za to uda się wstawić liczby 0 i 1:
INSERT INTO example VALUES(0);
INSERT INTO example VALUES(1);

Wyczyśćmy tabelę example z danych za pomocą polecenia:

DELETE FROM example;

Pozwoli nam to lepiej obserwować wyniki kolejnych zapytań SQL.

Synonimem dla BIT jest BOOLEAN , więc możemy wstawić do kolumny typu BIT wartości FALSE lub TRUE :
INSERT INTO example VALUES( TRUE );
INSERT INTO example VALUES( FALSE );

Spójrzmy na wartości w tabeli:

Jak widzimy w miejsce TRUE zostało wstawione 1, a w miejsce FALSE zero.

Do tego typu kolumny możemy wstawić także NULL:

INSERT INTO example VALUES( NULL );

, jeśli na kolumnie nie nadaliśmy ograniczenia  NOT NULL:

Do tego momentu rozpatrywaliśmy typ danych BIT ograniczający wartości do 1 bita. Teraz przejdziemy do typu BIT pozwalającego na przechowywanie więcej bitów, w naszym przykładzie 3 bitów. Usuwamy więc tabelę example za pomocą polecenia;

DROP TABLE example;

i tworzymy nową o tej samej nazwie, ale innym typie danych:

CREATE TABLE example(source BIT(3) );

Następnie tabelę zasilamy danymi 3 bitowymi:

INSERT INTO example VALUES(0b 111 );

Zauważ, że wstawione bity: 111, pojawiły się w tabeli jako liczba 7, bo typ danych BIT to typ numeryczny. A co się stanie przy próbie wstawienia cztero-bitowej wartości:

INSERT INTO example VALUES(B' 1000' );

Oczywiście pojawi się błąd wynikający z długości sekwencji bitów. Ten sam błąd pojawi się także przy próbie wstawienia liczby 8, bo liczba ta wymaga do jej przedstawienia 4 bitów ( 1000 ):
INSERT INTO example VALUES(8);

Ale liczba 7 zostanie wstawiona bez problemu, bo zajmuje 3 bity (wartość: 111 ):
INSERT INTO example VALUES( 7 );

W MySQL typ danych BIT działa tylko dla liczb całkowitych nieujemnych.