MySQL: شرح مفصل ودليل اختيار لأنواع بيانات MySQL
آخر تحديث: 2026-08-26
تحدد أنواع البيانات كيفية تخزين البيانات، والمساحة التي تشغلها، والعمليات التي يمكن إجراؤها عليها — وقد يؤدي اختيار النوع الخاطئ إلى عواقب وخيمة.
يقدم هذا الدرس نظرة عامة منهجية على جميع أنواع بيانات MySQL واستراتيجيات اختيارها.
graph TB
A[MySQL Data Types] --> B[Integer Types]
A --> C[Floating-point/Fixed-point type]
A --> D[String Type]
A --> E[Date and Time Type]
A --> F[JSON Type]
B --> B1[TINYINT]
B --> B2[SMALLINT]
B --> B3[INT]
B --> B4[BIGINT]
C --> C1[FLOAT]
C --> C2[DOUBLE]
C --> C3[DECIMAL]
D --> D1[CHAR]
D --> D2[VARCHAR]
D --> D3[TEXT]
D --> D4[ENUM]
E --> E1[DATE]
E --> E2[DATETIME]
E --> E3[TIMESTAMP]
1. ما ستتعلمه
- أنواع الأعداد الصحيحة (من TINYINT إلى BIGINT)
- أنواع الأرقام العائمة والأرقام الثابتة (FLOAT/DOUBLE/DECIMAL)
- أنواع السلاسل (CHAR/VARCHAR/TEXT/ENUM)
- أنواع التاريخ والوقت (DATE/DATETIME/TIMESTAMP)
- نوع JSON (MySQL 8.0 وما بعده)
2. قصة حقيقية حول مسألة تتعلق بالدقة
(1) المشكلة: تم حساب المبلغ بشكل خاطئ
يخزن نظام التجارة الإلكترونية أسعار المنتجات كقيم من نوع FLOAT:
-- Demonstration of Floating-Point Precision Loss
SELECT 0.1 + 0.2; -- Results: 0.300000004(approximate value,Inaccurate)
-- It becomes more apparent after it is entered into the table
CREATE TABLE float_demo (price FLOAT);
INSERT INTO float_demo VALUES (199.99);
SELECT price FROM float_demo; -- Results: 199.99(The display is correct, but there is a slight error in the internal storage.)
SELECT price + 0.01 FROM float_demo; -- Cumulative errors may become apparent during calculations
بعد إجراء 1,000 معاملة، تسبب الخطأ التراكمي في الدقة في حدوث تباين قدره بضعة يوان في التسوية المالية.
(2) حل مسألة «DECIMAL»
-- DECIMAL Precise Storage,No error
CREATE TABLE decimal_demo (price DECIMAL(10,2));
INSERT INTO decimal_demo VALUES (199.99);
SELECT price + 0.01 FROM decimal_demo; -- Results: 200.00(Accurate)
النتيجة: price = 200.00، دقيقة وخالية من الأخطاء.
| النوع | الدقة | السيناريوهات التي ينطبق عليها |
|---|---|---|
| FLOAT | تقريبي (6–7 أرقام) | الحسابات العلمية؛ لا يلزم الدقة |
| مزدوج | تقريبي (15–16 بت) | الحوسبة العلمية |
| العدد العشري | الدقة | المبالغ، البيانات المالية |
3. أنواع الأعداد الصحيحة
| النوع | البايتات | النطاق الموقَّع | النطاق غير الموقَّع |
|---|---|---|---|
| TINYINT | 1 | -128 ~ 127 | 0 ~ 255 |
| SMALLINT | 2 | -32,768 ~ 32,767 | 0 ~ 65,535 |
| MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 |
| المدخلات | 4 | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 |
| BIGINT | 8 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 |
▶ مثال: أنواع الأعداد الصحيحة
CREATE TABLE user_stats (
id INT PRIMARY KEY AUTO_INCREMENT,
age TINYINT UNSIGNED, -- Age 0-255 Enough
view_count INT UNSIGNED, -- Number of views
total_orders BIGINT UNSIGNED -- Total Number of Orders(It's very likely)
);
-- UNSIGNED Indicates unsigned(Only positive numbers)
INSERT INTO user_stats (age, view_count, total_orders)
VALUES (25, 1000000, 9999999999);
TINYINT للعمر وBIGINT لمعرف المستخدم.
4. أنواع الأرقام العائمة والأرقام الثابتة
| النوع | البايتات | الدقة | حالات الاستخدام |
|---|---|---|---|
| FLOAT | 4 | 6–7 أرقام | الحوسبة العلمية |
| مزدوج | 8 | 15–16 بت | الحوسبة العلمية |
| DECIMAL(M,D) | متغير | دقيق | المبالغ، الشؤون المالية |
M = إجمالي عدد الأرقام، D = عدد الخانات العشرية. يشير الرمز
DECIMAL(10,2)إلى ما يصل إلى 10 أرقام صحيحة + 2 خانة عشرية.
▶ مثال: استخدام DECIMAL
CREATE TABLE financials (
id INT PRIMARY KEY,
amount DECIMAL(12,2), -- Amount,Maximum 9999999999.99
rate DECIMAL(5,4), -- Ratio,Maximum 9.9999
quantity DECIMAL(8,0) -- Number of integers
);
INSERT INTO financials VALUES (1, 1234567.89, 0.0850, 1000);
SELECT * FROM financials;
الناتج:
+----+-------------+--------+----------+
| id | amount | rate | quantity |
+----+-------------+--------+----------+
| 1 | 1234567.89 | 0.0850 | 1000 |
+----+-------------+--------+----------+
5. نوع السلسلة
| النوع | الطول الأقصى | الميزات | حالات الاستخدام |
|---|---|---|---|
| CHAR(N) | 255 بايت | طول ثابت، سريع | أرقام الهواتف المحمولة، أرقام الهوية، MD5 |
| VARCHAR(N) | 65,535 بايت | طول متغير، موفر للمساحة | اسم المستخدم، البريد الإلكتروني، اللقب |
| TINYTEXT | 255 بايت | نص | نص قصير |
| نص | 65,535 بايت | نص | محتوى المقال |
| نص متوسط | 16M | نص | مقال طويل |
| نص طويل | 4G | نص | نص طويل جدًا |
| ENUM | 65,535 قيمة | التعداد | الحالة، النوع |
| مجموعة | 64 قيمة | مجموعة | تسميات الاختيار المتعدد |
(1) CHAR مقابل VARCHAR
-- CHAR(10) Fixed length, storing 'abc' uses 10 bytes
-- VARCHAR(10) Variable length, storing 'abc' uses 4 bytes (3 + 1 length prefix)
CREATE TABLE phones (
-- Mobile Number (Fixed 11 digits), use CHAR for faster lookup
mobile CHAR(11),
-- Username length varies, use VARCHAR to save space
username VARCHAR(50)
);
▶ مثال: نوع التعداد ENUM
CREATE TABLE orders (
id INT PRIMARY KEY,
status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') DEFAULT 'pending'
);
INSERT INTO orders (id, status) VALUES (1, 'paid');
INSERT INTO orders (id) VALUES (2); -- Default 'pending'
-- ENUM stores numerical indexes (1,2,3...), not strings
SELECT status, status + 0 AS index_num FROM orders;
الناتج:
+---------+-----------+
| status | index_num |
+---------+-----------+
| paid | 2 |
| pending | 1 |
+---------+-----------+
6. أنواع التاريخ والوقت
| النوع | التنسيق | النطاق | البايتات |
|---|---|---|---|
| التاريخ | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 3 |
| الوقت | ساعة:دقيقة:ثانية | -838:59:59 ~ 838:59:59 | 3 |
| التاريخ والوقت | YYYY-MM-DD HH:MM:SS | 1000-01-01 ~ 9999-12-31 | 8 |
| الطابع الزمني | YYYY-MM-DD HH:MM:SS | 1970-01-01 ~ 2038-01-19 | 4 |
| السنة | YYYY | 1901 ~ 2155 | 1 |
(1) DATETIME مقابل TIMESTAMP
| البعد | DATETIME | TIMESTAMP |
|---|---|---|
| النطاق | 1000–9999 | 1970–2038 |
| التخزين | 8 بايت | 4 بايت |
| المنطقة الزمنية | عدم التحويل | التحويل تلقائيًا إلى توقيت UTC |
| التوصية | التاريخ | وقت إنشاء/تعديل السجل |
▶ مثال: استخدام التواريخ والأوقات
CREATE TABLE events (
id INT PRIMARY KEY AUTO_INCREMENT,
event_name VARCHAR(100),
event_date DATE,
start_time TIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
INSERT INTO events (event_name, event_date, start_time)
VALUES ('Tech Conference', '2026-09-15', '09:00:00');
SELECT * FROM events;
الناتج:
+----+----------------+------------+------------+---------------------+---------------------+
| id | event_name | event_date | start_time | created_at | updated_at |
+----+----------------+------------+------------+---------------------+---------------------+
| 1 | Tech Conference| 2026-09-15 | 09:00:00 | 2026-07-03 10:00:00 | 2026-07-03 10:00:00 |
+----+----------------+------------+------------+---------------------+---------------------+
7. نوع البيانات JSON (MySQL 8.0 وما بعده)
▶ مثال: التعامل مع JSON
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
attributes JSON
);
INSERT INTO products (name, attributes) VALUES
('iPhone', '{"color": "black", "storage": 128, "tags": ["phone", "apple"]}');
-- Extract JSON value
SELECT
name,
attributes->>'$.color' AS color,
attributes->>'$.storage' AS storage
FROM products;
-- JSON Array Lookup
SELECT * FROM products WHERE JSON_CONTAINS(attributes->'$.tags', '"apple"');
الناتج:
+--------+-------+---------+
| name | color | storage |
+--------+-------+---------+
| iPhone | black | 128 |
+--------+-------+---------+
8. أفضل الممارسات لاختيار أنواع البيانات
| السيناريو | النوع الموصى به | السبب |
|---|---|---|
| معرّف المفتاح الأساسي | BIGINT AUTO_INCREMENT | نطاق واسع، أداء جيد |
| اسم المستخدم | VARCHAR(50) | طول متغير، يوفر مساحة |
| البريد الإلكتروني | VARCHAR(100) | طول متغير |
| رقم الهاتف | CHAR(11) | طول ثابت، عمليات بحث سريعة |
| تجزئة كلمة المرور | CHAR(60) | bcrypt محددة بـ 60 حرفًا |
| المبلغ | DECIMAL(10,2) | الحساب الدقيق |
| الحالة | ENUM أو TINYINT | خيارات محدودة |
| محتوى المقال | نص | نص طويل |
| وقت الإنشاء | الطابع الزمني | تُدار تلقائيًا، 4 بايت |
| بيانات JSON | JSON | يدعم الفهارس والوظائف |
❓ أسئلة شائعة
INDEX(col(100))). إذا كنت بحاجة إلى فهرس كامل، ففكر في استخدام VARCHAR.📖 ملخص
- حدد أنواع الأعداد الصحيحة حسب النطاق: TINYINT → SMALLINT → INT → BIGINT
- يجب تخزين المبالغ كنوع بيانات DECIMAL؛ ولا يجوز استخدام أنواع البيانات FLOAT أو DOUBLE.
- CHAR طول ثابت (رقم الهاتف)، VARCHAR طول متغير (اسم المستخدم)
- ENUM مناسب لمجموعة محدودة من الخيارات (الحالات، الأنواع)
- TIMESTAMP مناسب لتسجيل الوقت، بينما DATETIME مناسب للتواريخ التجارية
- يدعم النوع JSON البيانات المرنة وشبه المنظمة
📝 تمارين
-
سؤال أساسي (درجة الصعوبة ⭐): صمم جدول
productsلنظام التجارة الإلكترونية، واختر أنواع البيانات المناسبة لتخزين الاسم والسعر والمخزون والحالة والوصف. -
تمرين متقدم (مستوى الصعوبة ⭐⭐): أنشئ جدولاً باسم
user_profilesيحتوي على حقل باسمpreferencesمن نوع JSON، وتدرب على استخراج قيم JSON والاستعلام عنها. -
التحدي (مستوى الصعوبة: ⭐⭐⭐): قارن الفروق في الدقة بين
DECIMAL(10,2)وFLOATعند تخزين القيم، واستخدم التجارب لإثبات دقةDECIMAL.