MySQL - INT
MySQL - INT 数据类型
Section titled “MySQL - INT 数据类型”INT(或 INTEGER)数据类型是 MySQL 中用于存储整数的基本数值类型。MySQL 提供了多种整数类型,可以有效地存储不同大小的数字,从而优化存储空间。
选择正确的整数类型是在所需值范围和要使用的存储空间之间进行权衡。使用能够安全容纳您的数据的最小类型是最佳实践。
| 类型 | 存储空间(字节) | 最小值(有符号) | 最大值(有符号) | 最大值(无符号) |
|---|---|---|---|---|
| TINYINT | 1 | -128 | 127 | 255 |
| SMALLINT | 2 | -32,768 | 32,767 | 65,535 |
| MEDIUMINT | 3 | -8,388,608 | 8,388,607 | 16,777,215 |
| INT | 4 | -2,147,483,648 | 2,147,483,647 | 4,294,967,295 |
| BIGINT | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | 18,446,744,073,709,551,615 |
AUTO_INCREMENT 属性
Section titled “AUTO_INCREMENT 属性”AUTO_INCREMENT 属性允许 MySQL 自动为新行生成唯一的整数。它通常用于主键列。
- 主键:
AUTO_INCREMENT列必须是键(通常是PRIMARY KEY)。 - 唯一值:当您向
AUTO_INCREMENT列插入NULL或0时,MySQL 会自动分配下一个序列号。 - 序列重新播种:如果您明确插入一个更高的值,序列将重新播种为该值 + 1,用于下一次插入。
- 获取 ID:在
INSERT操作后,您可以使用LAST_INSERT_ID()函数检索最后生成的 ID。
CREATE TABLE products ( product_id INT AUTO_INCREMENT PRIMARY KEY, product_name VARCHAR(255) NOT NULL);
-- 插入一些行INSERT INTO products (product_name) VALUES ('Laptop'), ('Mouse');
-- 检查生成的 IDSELECT * FROM products;-- 结果将显示 Laptop 的 product_id 为 1,Mouse 为 2
-- 查找此会话中最后插入的 IDSELECT LAST_INSERT_ID(); -- 结果:2UNSIGNED 属性
Section titled “UNSIGNED 属性”默认情况下,整数类型是 SIGNED(有符号的),意味着它们可以存储正值和负值。如果列只存储非负数(如产品 ID 或计数),您可以将其声明为 UNSIGNED(无符号的)。这有效地将列可以容纳的最大正值加倍。
CREATE TABLE inventory ( item_id INT UNSIGNED NOT NULL, quantity INT UNSIGNED NOT NULL);
-- 此插入操作正常工作INSERT INTO inventory (item_id, quantity) VALUES (101, 50);
-- 此插入将因“超出范围”错误而失败INSERT INTO inventory (item_id, quantity) VALUES (102, -5);已弃用的属性:显示宽度和 ZEROFILL
Section titled “已弃用的属性:显示宽度和 ZEROFILL”⚠️ **重要提示:** `ZEROFILL` 属性和整数类型的“显示宽度”概念(例如 `INT(11)`)从 MySQL 8.0.17 开始已**弃用**,并将在未来版本中移除。在新开发中应避免使用它们。过去,INT(11) 并没有限制整数的大小。它只是一个提示,告诉应用程序在显示时使用多少个字符,通常与 ZEROFILL 结合使用。ZEROFILL 会用前导零填充数字,直到达到显示宽度。
现代替代方案:应用程序端格式化
Section titled “现代替代方案:应用程序端格式化”格式化是表现层问题,应在您的应用程序代码中处理,或者在必要时使用 SQL 格式化函数(例如 LPAD())。
-- 存储一个数字CREATE TABLE legacy_orders (order_id INT);INSERT INTO legacy_orders VALUES (123);
-- 使用 SQL 格式化输出以进行显示-- 这是实现零填充的现代方式。SELECT LPAD(order_id, 8, '0') AS formatted_order_id FROM legacy_orders;
-- 输出:-- +--------------------+-- | formatted_order_id |-- +--------------------+-- | 00000123 |-- +--------------------+在客户端程序中使用 INT
Section titled “在客户端程序中使用 INT”从客户端程序创建表时,您只需指定整数类型。任何格式化都应在显示数据时处理。
示例(使用 mysql-connector-python 的 Python)
Section titled “示例(使用 mysql-connector-python 的 Python)”import mysql.connector
# 数据库连接配置config = { 'user': 'root', 'password': 'your_password', 'host': '127.0.0.1', 'database': 'testdb'}
try: with mysql.connector.connect(**config) as connection: with connection.cursor() as cursor: # 如果表存在则删除,以确保干净运行 cursor.execute("DROP TABLE IF EXISTS users")
# 创建带有 INT AUTO_INCREMENT 主键的表 create_table_query = ''' CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, login_attempts INT UNSIGNED DEFAULT 0 ) ''' cursor.execute(create_table_query) print("Table 'users' created successfully.")
# 插入记录并获取新 ID insert_query = "INSERT INTO users (username) VALUES (%s)" cursor.execute(insert_query, ('john_doe',)) new_id = cursor.lastrowid connection.commit() print(f"New user inserted with ID: {new_id}")
except mysql.connector.Error as err: print(f"Error: {err}")