MySQL - INT 資料型別



MySQL INT 資料型別

MySQL 的INT資料型別用於儲存沒有小數位的整數。

但是,MySQL 提供了各種整數資料型別,例如 TINYINT、SMALLINT、MEDIUMINT 和 BIGINT,以滿足不同範圍的整數的需求。

下表說明了 MySQL 中不同整數型別的特性,包括儲存空間(以位元組為單位)、帶符號和無符號選項的最小值和最大值:

型別 儲存空間 (位元組) 最小值 (帶符號/無符號) 最大值 (帶符號/無符號)
TINYINT 1 -128/ 0 127/ 255
SMALLINT 2 -32768/ 0 32767/ 65535
MEDIUMINT 3 -8388608/ 0 8388607/ 16777215
INT 4 -8388607/ 16777215 2147483647/ 4294967295
BIGINT 8 - 9223372036854775808 / 0 9223372036854775807 / 18446744073709551615

我們必須根據儲存的資料型別選擇資料型別。如果可能,我們需要使用較小的資料型別來最小化資料庫大小。TINYINT 可用於儲存較小的數字,而 INT 或 BIGINT 可用於儲存較大的數字,例如國家/地區的電話號碼。

MySQL INT 的自動遞增

在 MySQL 中,您可以將AUTO_INCREMENT屬性與INT列一起使用,以自動為該列生成唯一值。以下是其工作原理:

  • 初始值:當您建立一個帶有 AUTO_INCREMENT INT 列的表時,序列從 1 開始。

  • 插入 NULL 或 0:當您插入一條記錄並在 AUTO_INCREMENT 列中插入 NULL 或 0 值時,MySQL 會將該值設定為下一個序列值。這意味著它會從 1 開始分配下一個可用的整數。

  • 插入非 NULL 值:如果您將非 NULL 值插入到 AUTO_INCREMENT 列中,MySQL 會接受該值並根據插入的新值繼續序列。

示例

首先,我們建立一個名為 STUDENTS 的表,其中包含一個名為“ID”的 AUTO_INCREMENT INT 列:

CREATE TABLE STUDENTS (
   ID int auto_increment,
   NAME varchar(20),
   primary key (ID)
);

當我們向此表中插入記錄而不為“ID”列指定值時,MySQL 會自動從 1 開始為“ID”生成唯一值。

在這裡,我們使用以下 INSERT 查詢向 STUDENTS 表中插入三行:

INSERT INTO STUDENTS (NAME) VALUES 
('Tilak'), ('Akash'), ('Surya'), ('Deepak');

建立的 STUDENTS 表如下所示:

ID 姓名
1 Tilak
2 Akash
3 Surya
4 Deepak

現在,讓我們插入一行,其中我們為“ID”列提供顯式值:

INSERT INTO STUDENTS (ID, NAME) VALUES (15, 'Arjun');

獲得的輸出如下所示:

Query OK, 1 row affected (0.01 sec)

由於我們將“ID”指定為 15,因此 MySQL 將序列重置為 16。如果我們插入新行而不指定“ID”,MySQL 將使用 16 作為下一個 AUTO_INCREMENT 值:

INSERT INTO STUDENTS (NAME) VALUES ('Dev');

獲得的輸出如下所示:

Query OK, 1 row affected (0.01 sec)

現在,讓我們從“STUDENTS”表中檢索記錄:

SELECT * FROM STUDENTS;

生成的表為:

ID 姓名
1 Tilak
2 Akash
3 Surya
4 Deepak
15 Arjun
16 Dev
從 MySQL 5.1 版本開始,AUTO_INCREMENT列僅接受正值,不允許負值。

MySQL INT UNSIGNED

在 MySQL 中,當您在列上定義 UNSIGNED INT 時,該列將被限制為僅儲存非負值(即正值)。此類列中不允許使用負值。

示例

讓我們使用以下查詢建立一個名為EMPLOYEES的表:

CREATE TABLE EMPLOYEES (
   ID int auto_increment,
   NAME varchar(30) not null,
   AGE int UNSIGNED,
   Primary key(ID)
);

獲得的輸出如下所示:

Query OK, 0 rows affected (0.04 sec)

現在,讓我們向“AGE”列中插入一個非負值:

INSERT INTO EMPLOYEES (NAME, AGE) VALUES ('Varun', 32);

上述查詢將成功執行,因為為“AGE”列提供的值是非負的。

Query OK, 1 row affected (0.01 sec)

但是,如果我們嘗試向“AGE”列中插入負值,MySQL 將生成錯誤:

INSERT INTO EMPLOYEES (NAME, AGE) VALUES ('Sunil', -10);

MySQL 將發出如下所示的錯誤:

ERROR 1264 (22003): Out of range value for column 'AGE' at row 1

MySQL INT 帶顯示寬度屬性

在 MySQL 中,您可以透過在 INT 關鍵字後使用括號來指定 INT 資料型別的顯示寬度。例如,使用 INT(5) 將顯示寬度設定為五位數字。

需要注意的是,MySQL 中 INT 的顯示寬度屬性不會影響可以儲存在列中的值的範圍。它在應用程式中格式化整數值,並作為元資料包含在結果集中。

例如,如果您將值 12345 插入到 EMPLOYEES 表的 id 列中,它將按原樣儲存。當您檢索它時,某些應用程式可能會選擇用前導零填充它,以確保它顯示為五位數字(例如,012345)。

MySQL INT 帶 ZEROFILL 屬性

在 MySQL 中,ZEROFILL 屬性是一個非標準屬性,可以應用於數值資料型別。它會在顯示的值前面新增前導零,確保數字以固定寬度顯示,對於數字程式碼特別有用。

示例

讓我們建立一個名為ZEROFILL_TABLE的表,使用下面的查詢將 ZEROFILL 應用於 INT 列:

CREATE TABLE ZEROFILL_TABLE (
   col1 int(4) ZEROFILL,
   col2 int(6) ZEROFILL,
   col3 int(8) ZEROFILL
);

獲得的輸出如下所示:

Query OK, 0 rows affected, 6 warnings (0.02 sec)

現在,我們向上面建立的表中插入一行新資料:

INSERT INTO ZEROFILL_TABLE (col1, col2, col3) 
VALUES (1, 7, 3);

以下是上述程式碼的輸出:

Query OK, 1 row affected (0.00 sec)

現在,讓我們顯示 ZEROFILL_TABLE 表中的記錄:

SELECT * FROM ZEROFILL_TABLE;

我們可以看到下面的輸出中,值以指定的寬度顯示,並且添加了前導零以保持該寬度,這由 ZEROFILL 屬性決定:

col1 col2 col3
0001 000007 00000003

使用客戶端程式的 INT 資料型別

我們也可以使用客戶端程式建立 INT 資料型別的列。

語法

要透過 PHP 程式建立 INT 資料型別的列,我們需要使用mysqli函式query()執行“CREATE TABLE”語句,如下所示:

$sql = 'CREATE TABLE students (Id INT AUTO_INCREMENT primary key not null, reg_No INT )';
$mysqli->query($sql);

要透過 JavaScript 程式建立 INT 資料型別的列,我們需要使用mysql2庫的query()函式執行“CREATE TABLE”語句,如下所示:

sql = "CREATE TABLE students (Id INT AUTO_INCREMENT primary key not null, reg_No INT )";
con.query(sql);

要透過 Java 程式建立 INT 資料型別的列,我們需要使用JDBC函式execute()執行“CREATE TABLE”語句,如下所示:

String sql = "CREATE TABLE students(Id INT AUTO_INCREMENT primary key not null, reg_No INT)";
statement.execute(sql);

要透過 Python 程式建立 INT 資料型別的列,我們需要使用MySQL Connector/Pythonexecute()函式執行“CREATE TABLE”語句,如下所示:

sql = 'CREATE TABLE students (ID int auto_increment, NAME varchar(20), primary key (ID) )'    
cursorObj.execute(sql)

示例

以下是程式:

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
   printf("Connect failed: %s
", $mysqli->connect_error); exit(); } //printf('Connected successfully.
'); //create table with boolean column $sql = 'CREATE TABLE students (Id INT AUTO_INCREMENT primary key not null, reg_No INT )'; $result = $mysqli->query($sql); if ($result) { printf("Table created successfully...!\n"); } //insert data into created table $q = "INSERT INTO students (reg_No) VALUES (101), (102)"; if ($res = $mysqli->query($q)) { printf("Data inserted successfully...!\n"); } //now display the table records $s = "SELECT Id, reg_No FROM students"; if ($r = $mysqli->query($s)) { printf("Table Records: \n"); while ($row = $r->fetch_assoc()) { printf(" ID: %d, Reg: %s", $row["Id"], $row["reg_No"]); printf("\n"); } } else { printf('Failed'); } $mysqli->close();

輸出

獲得的輸出如下所示:

Table Records:
ID: 1, Reg: 101
ID: 2, Reg: 102         
var mysql = require("mysql2");
var con = mysql.createConnection({
   host: "localhost",
   user: "root",
   password: "password",
}); //Connecting to MySQL

con.connect(function (err) {
   if (err) throw err;
   //console.log("Connected successfully...!");
   //console.log("--------------------------");
   sql = "USE TUTORIALS";
   con.query(sql);

   //create a students table, that accepts one column of int type.
   sql = "CREATE TABLE students (Id INT AUTO_INCREMENT primary key not null, reg_No INT )";
   con.query(sql);

   //insert data into created table
   sql = "INSERT INTO students (reg_No) VALUES (101), (102)";
   con.query(sql);

   //select datatypes of salary
   sql = `SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'students' AND COLUMN_NAME = 'reg_No'`;
   con.query(sql, function (err, result) {
      if (err) throw err;
      console.log(result);
   });
});  

輸出

產生的輸出如下所示:

[ { DATA_TYPE: 'int' } ]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Int {
   public static void main(String[] args) {
      String url = "jdbc:mysql://:3306/TUTORIALS";
      String username = "root";
      String password = "password";
      try {
         Class.forName("com.mysql.cj.jdbc.Driver");
         Connection connection = DriverManager.getConnection(url, username, password);
         Statement statement = connection.createStatement();
         System.out.println("Connected successfully...!");

         //Int data types...!;
         String sql = "CREATE TABLE students(Id INT AUTO_INCREMENT primary key not null, reg_No INT)";
         statement.execute(sql);
         System.out.println("column of a INT type created successfully...!");
         ResultSet resultSet = statement.executeQuery("DESCRIBE students");
         while (resultSet.next()){
            System.out.println(resultSet.getString(1)+" "+resultSet.getString(2));
         }
         connection.close();
      } catch (Exception e) {
         System.out.println(e);
      }
   }
}  

輸出

獲得的輸出如下所示:

Connected successfully...!
column of a INT type created successfully...!
Id int
reg_No int  
import mysql.connector
# Establishing the connection
connection = mysql.connector.connect(
   host='localhost',
   user='root',
   password='password',
   database='tut'
)
# Creating a cursor object
cursorObj = connection.cursor()
# Create table with int column
sql = '''CREATE TABLE students (
ID int auto_increment,
NAME varchar(20),
primary key (ID)
)'''
cursorObj.execute(sql)
print("The table is created successfully!")
# Data to be inserted
data_to_insert = [
    (1, 'Tilak'),
    (2, 'Akash'),
    (3, 'Surya'),
    (4, 'Deepak'),
    (15, 'Arjun'),
    (16, 'Dev')
]
# Insert data into the created table
insert_query = "INSERT INTO STUDENTS (ID, NAME) VALUES (%s, %s)"
cursorObj.executemany(insert_query, data_to_insert)
# Commit the changes after the insert operation
connection.commit()
print("Rows inserted successfully.")
# Now display the table records
select_query = "SELECT * FROM Students"
cursorObj.execute(select_query)
result = cursorObj.fetchall()
print("Table Data:")
for row in result:
    print(row)
cursorObj.close()
connection.close()  

輸出

以下是上述程式碼的輸出:

The table is created successfully!
Rows inserted successfully.
Table Data:
(1, 'Tilak')
(2, 'Akash')
(3, 'Surya')
(4, 'Deepak')
(15, 'Arjun')
(16, 'Dev')
廣告