MySQL - TINYINT
MySQL: TINYINT 数据类型
Section titled “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 中弃用。它们不影响列的存储范围,不应再在现代开发中使用。布尔值的约定
Section titled “布尔值的约定”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 命令将显示底层类型:
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id | int | NO | PRI | NULL | auto_increment |
| product_name | varchar(100) | NO | NULL | ||
| is_available | tinyint(1) | NO | 1 | ||
| status_code | tinyint unsigned | NO | 0 |
插入和查询数据
Section titled “插入和查询数据”现在让我们插入一些数据。您可以为布尔列使用 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);处理超出范围的错误
Section titled “处理超出范围的错误”如果您尝试插入超出 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按布尔值过滤
Section titled “按布尔值过滤”您可以根据布尔列轻松过滤记录。
-- 查找所有可用产品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.connectorimport osfrom 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'>