Skip to content

MySQL - TINYINT

MySQL 中的 TINYINT 数据类型是可用的最小整数类型。它用于存储范围非常小的整数值,仅占用 1 字节(8 位)存储空间。这使得它在存储标志、状态码或小计数器等数据时效率极高。

TINYINT 可以定义为 SIGNED(默认)或 UNSIGNED。

  • TINYINT SIGNED:可以存储从 -128 到 127 的值。
  • TINYINT UNSIGNED:可以存储从 0 到 255 的值。
**弃用通知:** 在旧版本的 MySQL 中,您可能会看到 `TINYINT(M)`,其中 `M` 是显示宽度。此属性以及 `ZEROFILL` 已在 MySQL 8.0.17 中弃用。它们不影响列的存储范围,不应再在现代开发中使用。

MySQL 没有原生的 BOOLEAN 或 BOOL 数据类型。相反,这些是创建 TINYINT(1) 列的别名。这已成为在 MySQL 中存储真/假值的标准约定。

  • 值为 0 被认为是 false。
  • 任何非零值(通常是 1)被认为是 true。

当您使用 is_active BOOLEAN 创建表时,MySQL 实际上创建的是 is_active TINYINT(1)。这对于数据库设计和应用程序级逻辑都是一个重要的概念。

让我们创建一个 products 表,它使用 TINYINT 作为状态标志和库存状态码。

-- 创建 products 表
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
is_available BOOLEAN NOT NULL DEFAULT TRUE, -- 存储为 TINYINT(1)
status_code TINYINT UNSIGNED NOT NULL DEFAULT 0 -- 0: 有库存, 1: 库存不足, 2: 缺货
);
-- 让我们看看 MySQL 实际是如何创建表的
DESCRIBE products;

DESCRIBE 命令将显示底层类型:

FieldTypeNullKeyDefaultExtra
idintNOPRINULLauto_increment
product_namevarchar(100)NONULL
is_availabletinyint(1)NO1
status_codetinyint unsignedNO0

现在让我们插入一些数据。您可以为布尔列使用 TRUE/FALSE 关键字。

INSERT INTO products (product_name, is_available, status_code) VALUES
('Laptop Pro', TRUE, 0),
('Wireless Mouse', FALSE, 2),
('Keyboard', TRUE, 1),
('Webcam', TRUE, 0);

如果您尝试插入超出 TINYINT 列允许范围的值,MySQL 将引发错误。

-- 这将失败,因为 -5 在 UNSIGNED 列中是不允许的。
INSERT INTO products (product_name, status_code) VALUES ('Invalid Product', -5);

MySQL 将返回一个类似于以下内容的错误:

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

您可以根据布尔列轻松过滤记录。

-- 查找所有可用产品
SELECT product_name FROM products WHERE is_available = TRUE;
product_name
Laptop Pro
Keyboard
Webcam

在应用程序中使用 TINYINT(Python 示例)

Section titled “在应用程序中使用 TINYINT(Python 示例)”

当您在应用程序中检索 TINYINT 数据时,数据库驱动程序通常会将其转换为原生整数或布尔类型。这是一个 Python 示例,展示了 TINYINT(1) 通常如何作为布尔值处理。

import mysql.connector
import os
from dotenv import load_dotenv
load_dotenv()
def get_product_availability():
"""获取产品数据并解释 TINYINT(1) 列。"""
products = []
try:
with mysql.connector.connect(
host=os.getenv('DB_HOST'),
user=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD'),
database=os.getenv('DB_NAME')
) as conn:
# 游标将自动处理 TINYINT(1) 到 Python 的 int (0 或 1)
with conn.cursor(dictionary=True) as cursor:
cursor.execute("SELECT product_name, is_available FROM products")
products = cursor.fetchall()
except mysql.connector.Error as e:
print(f"数据库错误: {e}")
return None
return products
if __name__ == "__main__":
product_list = get_product_availability()
if product_list:
print("产品可用性状态:")
for product in product_list:
# 我们可以在代码中将整数结果视为布尔值
name = product['product_name']
available = bool(product['is_available'])
status_text = "可用" if available else "不可用"
print(f"- {name}: {status_text}")
# 您还可以检查其类型
# print(f"Type of is_available for {name}: {type(product['is_available'])}") # 很可能是 <class 'int'>