MySql: Tinyint (2) so với tinyint (1) - sự khác biệt là gì?


183

Tôi biết boolean trong mysql là tinyint (1).

Hôm nay tôi thấy một bảng có định nghĩa một số nguyên như tinyint(2), và các bảng khác cũng như int(4), int(6)...

Kích thước có nghĩa là gì trong trường loại nguyên và tinyint?


4
Đọc về các kiểu dữ liệu MySQL Integer tại đây .
Bud Damyanov

2
Câu trả lời của @ AamirR là câu trả lời đúng
evilReiko

1
@evilReiko zerofill cũng không tạo ra sự khác biệt trong cách lưu trữ giá trị, nó thực sự là về cách trình bày ... không gian hoặc số không thực sự tạo ra sự khác biệt về tính chính xác của câu trả lời của bất kỳ ai
Ja͢ck 27/2/18

Câu trả lời:


94

Nó có nghĩa là chiều rộng màn hình

Cho dù bạn sử dụng tinyint (1) hay tinyint (2), nó cũng không tạo ra sự khác biệt nào.

Tôi luôn sử dụng tinyint (1) và int (11), tôi đã sử dụng một số máy khách mysql (navicat, sequel pro).

Nó không có nghĩa gì cả TẤT CẢ! Tôi đã chạy thử nghiệm, tất cả các máy khách ở trên hoặc thậm chí máy khách dòng lệnh dường như bỏ qua điều này.

Nhưng, chiều rộng hiển thị là quan trọng nhất nếu bạn đang sử dụng ZEROFILLtùy chọn, ví dụ: bảng của bạn có 2 cột sau:

Một zerofill nhỏ xíu (2)

Zerofill B tinyint (4)

cả hai cột có giá trị là 1, đầu ra cho cột A sẽ là 010001cho B , như được thấy trong ảnh chụp màn hình bên dưới :)

zerofill với độ rộng màn hình


20
Thật kỳ lạ, tôi vừa phát hiện ra rằng trong trình kết nối MySQL chính thức C # tinyint (1) không bao giờ trả về các giá trị khác 0 và 1. Điều này có thể phải làm với tinyint (1) tự động được nhận dạng là boolean. Chỉ cần một cái đầu lên đôi khi nó quan trọng.
Daniel Sharp

Không phải là tốt hơn để sử dụng một loại số nguyên và chiều dài càng nhỏ càng tốt? Tôi đã có ấn tượng bộ nhớ lưu này trong MySQL.
nclsvh

Như @ Daniel-Sharp chỉ ra rằng nó có vẻ quan trọng đối với các đầu nối. Chỉ có một vấn đề với Hibernate khi sử dụng báo cáo JDBC, nó đã hiểu TINYINT (1) là BIT.
sfj

2
@DanielSharp có lẽ là do tùy chọn kết nối tinyInt1isBit mặc định là true. Xem dev.mysql.com/doc/connector-j/8.0/en/ giết
Parisoust56

1
Tôi luôn nghĩ rằng điều này có liên quan đến số lượng số được chấp nhận (ví dụ: int (4) không cho phép bất cứ điều gì trên 9999). Đoán tôi luôn nghĩ sai rồi. Trong cả dòng lệnh PHP và MySQL tôi thấy giá trị trên nó đều ổn.
Joshua Bakker

226

Chỉ (m)ra chiều rộng hiển thị cột; các ứng dụng như máy khách MySQL sử dụng điều này khi hiển thị kết quả truy vấn.

Ví dụ:

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

Ở đây a, bcđang sử dụng TINYINT(1), TINYINT(2)TINYINT(3)tương ứng. Như bạn có thể thấy, nó đệm các giá trị ở phía bên trái bằng chiều rộng màn hình.

Điều quan trọng cần lưu ý là nó không ảnh hưởng đến phạm vi giá trị được chấp nhận cho loại cụ thể đó, tức là TINYINT(1)vẫn chấp nhận [-128 .. 127].


16
"Độ rộng cột" nghĩa là gì ??
realtebo

8
@realtebo nó chủ yếu được sử dụng bởi máy khách dòng lệnh mysql cho mục đích hiển thị.
Ja͢ck

3
Số lượng "chữ số" được hiển thị bởi giao diện. Nói cách khác, nó sẽ đệm số không ở bên trái. Loại tính năng này có ý nghĩa trong những ngày đầu của cơ sở dữ liệu, nhưng bây giờ nó chỉ là di sản.
Denilson Sá Maia

2
@Kailas Nếu bạn không sử dụng máy khách mysql? Không có gì cả.
Ja͢ck

11
@Kailas Không! tinyint (1) không chấp nhận chỉ 0-9. Nó chấp nhận toàn bộ phạm vi của những gì tinyint có thể nắm giữ.
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)

11
Vui lòng chỉnh sửa câu trả lời của bạn để bao gồm một số lời giải thích. Các câu trả lời chỉ có mã làm rất ít để giáo dục các độc giả SO tương lai. Câu trả lời của bạn là trong hàng đợi kiểm duyệt vì chất lượng thấp.
mickmackusa

14

Giới thiệu về INT, TINYINT ... Đây là các loại dữ liệu khác nhau, INT là số 4 byte, TINYINT là số 1 byte. Thêm thông tin ở đây - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT .

Cú pháp của kiểu dữ liệu TINYINT là TINYINT (M), trong đó M chỉ chiều rộng hiển thị tối đa (chỉ được sử dụng nếu máy khách MySQL của bạn hỗ trợ nó).

Thuộc tính kiểu số .


1
"Độ rộng màn hình" nghĩa là gì?
realtebo

2
Từ tham chiếu - Ví dụ: INT (4) chỉ định INT có chiều rộng hiển thị gồm bốn chữ số. Các ứng dụng này có thể sử dụng chiều rộng hiển thị tùy chọn này để hiển thị các giá trị nguyên có chiều rộng nhỏ hơn chiều rộng được chỉ định cho cột bằng cách đệm trái chúng với khoảng trắng.
Khởi hành

2
Nhưng tôi chưa thấy các ứng dụng hoặc máy khách MySQL sử dụng tính năng này. Tôi luôn sử dụng INT (11) và sử dụng các chức năng định dạng để tùy chỉnh đầu ra.
Khởi hành
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.