MySQL: شرح مفصل ودليل اختيار لأنواع بيانات MySQL

آخر تحديث: 2026-08-26

تحدد أنواع البيانات كيفية تخزين البيانات، والمساحة التي تشغلها، والعمليات التي يمكن إجراؤها عليها — وقد يؤدي اختيار النوع الخاطئ إلى عواقب وخيمة.

يقدم هذا الدرس نظرة عامة منهجية على جميع أنواع بيانات MySQL واستراتيجيات اختيارها.

100%
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. ما ستتعلمه



2. قصة حقيقية حول مسألة تتعلق بالدقة

(1) المشكلة: تم حساب المبلغ بشكل خاطئ

يخزن نظام التجارة الإلكترونية أسعار المنتجات كقيم من نوع FLOAT:

SQL
-- 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»

SQL
-- 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

▶ مثال: أنواع الأعداد الصحيحة

SQL
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

SQL
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;
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+----+-------------+--------+----------+
| 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

SQL
-- 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

SQL
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;
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+---------+-----------+
| 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
التوصية التاريخ وقت إنشاء/تعديل السجل

▶ مثال: استخدام التواريخ والأوقات

SQL
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;
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+----+----------------+------------+------------+---------------------+---------------------+
| 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

SQL
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"');
▶ جرّب الكود

الناتج:

TEXT 📖 للعرض فقط
+--------+-------+---------+
| 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 يدعم الفهارس والوظائف


❓ أسئلة شائعة

س ما الفرق بين VARCHAR(255) وVARCHAR(256)؟
ج بالنسبة لأطوال VARCHAR التي لا تتجاوز 255، يُستخدم بايت واحد لتخزين الطول؛ أما بالنسبة للأطوال التي تتجاوز 255، فيُستخدم بايتان. لا يوجد فرق جوهري في الأداء، لكن الرقم 255 يُعتبر نقطة فاصلة شائعة الاستخدام.
س ماذا عليّ أن أفعل بشأن مشكلة TIMESTAMP 2038؟
ج من المقرر بالفعل إصدار حل لهذه المشكلة في MySQL 8.0. إذا كان الأمر يقلقك، فاستخدم DATETIME بدلاً من ذلك.
س هل يمكن لحقل واحد تخزين قيم متعددة؟
ج يمكنك استخدام نوع البيانات SET أو مصفوفة JSON، لكن يُنصح بتقسيمها إلى جداول مرتبطة (وهو ما يُعد الممارسة الأكثر شيوعًا).
س هل يمكن فهرسة حقل TEXT؟
ج نعم، ولكن لا يمكن إنشاء سوى فهارس البادئة (INDEX(col(100))). إذا كنت بحاجة إلى فهرس كامل، ففكر في استخدام VARCHAR.

📖 ملخص


📝 تمارين

  1. سؤال أساسي (درجة الصعوبة ⭐): صمم جدول products لنظام التجارة الإلكترونية، واختر أنواع البيانات المناسبة لتخزين الاسم والسعر والمخزون والحالة والوصف.

  2. تمرين متقدم (مستوى الصعوبة ⭐⭐): أنشئ جدولاً باسم user_profiles يحتوي على حقل باسم preferences من نوع JSON، وتدرب على استخراج قيم JSON والاستعلام عنها.

  3. التحدي (مستوى الصعوبة: ⭐⭐⭐): قارن الفروق في الدقة بين DECIMAL(10,2) وFLOAT عند تخزين القيم، واستخدم التجارب لإثبات دقة DECIMAL.

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%