MySql: Tinyint (2) vs. tinyint (1) - jaka jest różnica?

183

Znałem wartość logiczną w mysql jako tinyint (1).

Dzisiaj widzę tabelę ze zdefiniowaną liczbą całkowitą tinyint(2), a także innymi int(4), int(6)...

Co oznacza rozmiar w polu typu integer i tinyint?

realtebo
źródło
4
Przeczytaj o typach danych MySQL Integer tutaj .
Bud Damyanov,
2
@ Odpowiedź AamirR jest poprawna
evilReiko
1
@evilReiko zerofill również nie ma wpływu na sposób przechowywania wartości, tak naprawdę chodzi o prezentację ... spacje lub zera tak naprawdę nie
wpływają

Odpowiedzi:

94

Oznacza szerokość wyświetlacza

Bez względu na to, czy używasz tinyint (1), czy tinyint (2), nie ma to znaczenia.

Zawsze używam tinyint (1) i int (11), korzystałem z kilku klientów mysql (navicat, sequel pro).

W ogóle nic nie znaczy! Przeprowadziłem test, wszystkie powyższe klienty, a nawet klient wiersza poleceń wydaje się to ignorować.

Ale szerokość wyświetlania jest najważniejsza, jeśli używasz ZEROFILLopcji, na przykład twoja tabela ma następujące 2 kolumny:

Tinyint (2) ZEROFILL

B tinyint (4) zerofill

obie kolumny mają wartość 1, dane wyjściowe dla kolumny A byłyby, 01a 0001dla B , jak widać na zrzucie ekranu poniżej :)

zerofill z wyświetlaniem szerokości

AamirR
źródło
20
Co dziwne, właśnie odkryłem, że w oficjalnym łączniku MySQL w C # tinyint (1) nigdy nie zwraca wartości innych niż 0 i 1. Prawdopodobnie ma to związek z automatycznym rozpoznawaniem tinyint (1) jako logiczną. Tylko jedna głowa do góry to czasami ma znaczenie.
Daniel Sharp
Czy nie lepiej jest używać możliwie najmniejszej liczby i typu liczb całkowitych? Miałem wrażenie, że ta zaoszczędzona pamięć w MySQL.
nclsvh
Jak zauważa @ Daniel-Sharp, może wydawać się to mieć znaczenie dla łączników. Właśnie miałem problem z Hibernacją przy użyciu raportu JDBC, który zinterpretował TINYINT (1) jako BIT.
sfj
2
@DanielSharp, który prawdopodobnie wynika z opcji połączenia tinyInt1isBit, która domyślnie ma wartość true. Zobacz dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56
1
Zawsze myślałem, że ma to związek z liczbą przyjmowanych liczb (na przykład int (4) nie zezwala na nic powyżej 9999). Chyba zawsze myślałem wtedy źle. Zarówno w wierszu poleceń PHP, jak i MySQL widzę wartość powyżej niej dobrze.
Joshua Bakker,
226

(m)Wskazuje szerokość wyświetlania kolumny; aplikacje takie jak klient MySQL wykorzystują to podczas wyświetlania wyników zapytania.

Na przykład:

| v   | a   |  b  |   c |
+-----+-----+-----+-----+
| 1   | 1   |  1  |   1 |
| 10  | 10  | 10  |  10 |
| 100 | 100 | 100 | 100 |

Tutaj a, ba cużywasz TINYINT(1), TINYINT(2)i TINYINT(3)odpowiednio. Jak widać, wypełnia wartości po lewej stronie, używając szerokości wyświetlania.

Należy zauważyć, że nie wpływa to na akceptowany zakres wartości dla tego konkretnego typu, tzn. TINYINT(1)Nadal akceptuje [-128 .. 127].

Jacek
źródło
16
co to znaczy „szerokość kolumny”?
realtebo,
8
@realtebo jest używany głównie przez klienta wiersza poleceń mysql do celów wyświetlania.
Ja͢ck
3
Liczba „cyfr” wyświetlanych przez interfejs. Innymi słowy, wstawi zera po lewej stronie. Ten rodzaj funkcji miał sens w początkowych czasach baz danych, ale teraz jest już tylko dziedzictwem.
Denilson Sá Maia
2
@Kailas Jeśli nie używasz klienta MySQL? Wcale.
Ja͢ck
11
@Kailas Nie! tinyint (1) nie akceptuje tylko 0-9. Akceptuje cały zakres tego, co może pomieścić tinyint.
Ja͢ck
18
mysql> CREATE TABLE tin3(id int PRIMARY KEY,val TINYINT(10) ZEROFILL);
Query OK, 0 rows affected (0.04 sec)

mysql> INSERT INTO tin3 VALUES(1,12),(2,7),(4,101);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM tin3;
+----+------------+
| id | val        |
+----+------------+
|  1 | 0000000012 |
|  2 | 0000000007 |
|  4 | 0000000101 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

mysql> SELECT LENGTH(val) FROM tin3 WHERE id=2;
+-------------+
| LENGTH(val) |
+-------------+
|          10 |
+-------------+
1 row in set (0.01 sec)


mysql> SELECT val+1 FROM tin3 WHERE id=2;
+-------+
| val+1 |
+-------+
|     8 |
+-------+
1 row in set (0.00 sec)
zloctb
źródło
11
Edytuj swoją odpowiedź, aby podać wyjaśnienie. Odpowiedzi tylko na kod niewiele mają na celu edukowanie przyszłych czytelników SO. Twoja odpowiedź znajduje się w kolejce moderacji za niską jakość.
mickmackusa
14

Informacje o INT, TINYINT ... Są to różne typy danych, INT to liczba 4-bajtowa, TINYINT to liczba 1-bajtowa. Więcej informacji tutaj - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

Składnia typu danych TINYINT to TINYINT (M), gdzie M oznacza maksymalną szerokość wyświetlania (używaną tylko, jeśli obsługuje go klient MySQL).

Atrybuty typu liczbowego .

Devart
źródło
1
co to znaczy „szerokość wyświetlacza”!?
realtebo,
2
Z opisu - Na przykład, INT (4) określa INT z szerokością wyświetlania czterech cyfr. Ta opcjonalna szerokość wyświetlania może być wykorzystywana przez aplikacje do wyświetlania wartości całkowitych o szerokości mniejszej niż szerokość określona dla kolumny, wypełniając je spacjami.
Devart,
2
Ale nie widziałem aplikacji ani klientów MySQL, które używają tej funkcji. Zawsze używam INT (11) i używam funkcji formatowania, aby dostosować dane wyjściowe.
Devart,