MySql: Tinyint (2) vs tinyint (1) - apa bedanya?

183

Saya tahu boolean di mysql sebagai tinyint (1).

Hari ini saya melihat tabel dengan bilangan bulat seperti tinyint(2), dan juga yang lain seperti int(4), int(6)...

Apa arti ukuran di bidang tipe integer dan tinyint?

realtebo
sumber
4
Baca tentang tipe data MySQL Integer di sini .
Bud Damyanov
2
@AamirR jawaban adalah yang benar
evilReiko
1
@evilReiko zerofill juga tidak membuat perbedaan dalam bagaimana nilai disimpan, ini benar-benar tentang presentasi ... spasi atau nol tidak benar-benar membuat perbedaan dalam ketepatan jawaban siapa pun imo
Ja͢ck

Jawaban:

94

Itu berarti lebar layar

Apakah Anda menggunakan tinyint (1) atau tinyint (2), itu tidak ada bedanya.

Saya selalu menggunakan tinyint (1) dan int (11), saya menggunakan beberapa klien mysql (navicat, sequel pro).

Sama sekali tidak berarti apa-apa! Saya menjalankan tes, semua klien di atas atau bahkan klien baris perintah tampaknya mengabaikan ini.

Tapi, lebar layar paling penting jika Anda menggunakan ZEROFILLopsi, misalnya tabel Anda memiliki 2 kolom berikut:

A tinyint (2) zerofill

B tinyint (4) zerofill

kedua kolom memiliki nilai 1, output untuk kolom A akan 01dan 0001untuk B , seperti yang terlihat pada tangkapan layar di bawah ini :)

zerofill dengan displaywidth

AamirR
sumber
20
Cukup aneh saya baru saja menemukan bahwa di C # konektor MySQL resmi tinyint (1) tidak pernah mengembalikan nilai yang berbeda dari 0 dan 1. Ini mungkin ada hubungannya dengan tinyint (1) secara otomatis diakui sebagai boolean. Hanya dengan mengangkat kepala, terkadang itu penting.
Daniel Sharp
Bukankah lebih baik menggunakan tipe integer dan panjang sekecil mungkin? Saya mendapat kesan memori yang tersimpan ini di MySQL.
nclsvh
Seperti yang ditunjukkan oleh @ Daniel-Sharp, konektor mungkin menjadi masalah. Baru saja mengalami masalah dengan Hibernate menggunakan JDBC melaporkannya menafsirkan TINYINT (1) sebagai BIT.
sfj
2
@DanielSharp yang mungkin karena opsi koneksi tinyInt1isBit yang defaultnya benar. Lihat dev.mysql.com/doc/connector-j/8.0/en/…
Parisbre56
1
Saya selalu berpikir ini ada hubungannya dengan jumlah angka yang diterima (misalnya, int (4) tidak mengizinkan apa pun di atas 9999). Kira saya selalu salah berpikir. Baik di baris perintah PHP dan MySQL saya melihat nilai di atasnya baik-baik saja.
Joshua Bakker
226

Yang (m)menunjukkan lebar tampilan kolom; aplikasi seperti klien MySQL memanfaatkan ini ketika menampilkan hasil permintaan.

Sebagai contoh:

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

Di sini a, bdan cmenggunakan TINYINT(1), TINYINT(2)dan TINYINT(3)masing - masing. Seperti yang dapat Anda lihat, ini memberi nilai pada sisi kiri menggunakan lebar layar.

Penting untuk dicatat bahwa itu tidak mempengaruhi rentang nilai yang diterima untuk jenis tertentu, yaitu TINYINT(1)masih menerima [-128 .. 127].

Mendongkrak
sumber
16
apa artinya 'lebar kolom' ??
realtebo
8
@ Realtebo ini terutama digunakan oleh klien baris perintah mysql untuk tujuan tampilan.
Ja͢ck
3
Jumlah "digit" yang ditunjukkan oleh antarmuka. Dengan kata lain, itu akan mengisi nol di sebelah kiri. Fitur semacam ini masuk akal di masa-masa awal basis data, tetapi sekarang ini hanyalah warisan.
Denilson Sá Maia
2
@Kailas Jika Anda tidak menggunakan klien mysql? Tidak sama sekali.
Ja͢ck
11
@Kailas Tidak! tinyint (1) tidak hanya menerima 0-9. Ia menerima seluruh jajaran apa yang bisa dipegang 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
sumber
11
Harap edit jawaban Anda untuk memasukkan beberapa penjelasan. Jawaban hanya kode tidak banyak membantu mendidik pembaca SO masa depan. Jawaban Anda ada dalam antrian moderasi karena berkualitas rendah.
mickmackusa
14

Tentang INT, TINYINT ... Ini adalah tipe data yang berbeda, INT adalah nomor 4-byte, TINYINT adalah nomor 1-byte. Informasi lebih lanjut di sini - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

Sintaks tipe data TINYINT adalah TINYINT (M), di mana M menunjukkan lebar tampilan maksimum (hanya digunakan jika klien MySQL Anda mendukungnya).

Atribut Tipe Numerik .

Devart
sumber
1
apa artinya 'lebar layar'!?
realtebo
2
Dari referensi - Misalnya, INT (4) menetapkan INT dengan lebar tampilan empat digit. Lebar tampilan opsional ini dapat digunakan oleh aplikasi untuk menampilkan nilai integer yang memiliki lebar kurang dari lebar yang ditentukan untuk kolom dengan melapisi bagian kiri dengan spasi.
Devart
2
Tapi saya belum melihat aplikasi atau klien MySQL yang menggunakan fitur ini. Saya selalu menggunakan INT (11) dan menggunakan fungsi format untuk menyesuaikan output.
Devart