mysql8_bit

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 (0b1001).
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:

mysql8
Następnie za pomocą polecenia:
USE test;

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

mysql8

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

mysql8

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:

mysql8

Za pomocą polecenia:

SELECT * FROM example;

wybieramy dane z tabeli.

mysql8

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);

mysql8

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

mysql8

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:

mysql8

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:

mysql8

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(0b111);

mysql8

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');

mysql8

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);

mysql8

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

mysql8

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany.