رفتن به محتوای اصلی
بازگشت به وبلاگ

داده و اتصال فنی

STRICT در SQLite؛ تبدیلِ نوع و رفتارِ ANY را واقعاً ببینیم

STRICT در SQLite همهٔ تبدیل‌ها را متوقف نمی‌کند؛ ماتریس ۲۴ درج، typeof و quote را برای INTEGER و ANY عادی و STRICT با خطاهای واقعی ثبت می‌کند.

STRICT در SQLite به معنی «هیچ تبدیلی انجام نمی‌شود» نیست. ستونِ INTEGER هنوز می‌تواند رشتهٔ عددیِ قابل‌تبدیل را به عدد تبدیل کند؛ اما مقدارِ ناسازگار را رد می‌کند. نوعِ ANY هم در جدول STRICT و عادی رفتار یکسان ندارد. تمرین این صفحه چهار جدول حافظه‌ای می‌سازد و پس از هر درج، نوع و مقدارِ واقعاً ذخیره‌شده را با typeof و quote گزارش می‌دهد.

نوعِ اعلامی را با نوعِ ذخیره‌شده مقایسه کنیم

شش مقدارِ اصیل را به هر جدول می‌دهیم: رشتهٔ 123، رشتهٔ 000123، عددِ اعشاریِ۳٫۰، عددِ۳٫۵، متن xyz و NULL. چهار حالت عبارت‌اند از INTEGER عادی، ANY عادی، INTEGER با STRICT و ANY با STRICT. هر مقدار با parameter به دستور داده می‌شود؛ هیچ فایلِ واقعی یا دادهٔ مشتری برای این جدول‌ها خوانده نشده است.

خروجی فقط قبول یا رد نیست. برای مقدارهای پذیرفته‌شده، typeof، نمایشِ quote و مقدارِ بازخوانی‌شده ثبت می‌شوند. برای ردیفِ ردشده هم، تمام ردیف‌های قبلی با تصویرِ قبل از آن تلاش مقایسه می‌شوند تا ثابت بمانند. این شواهد به ما می‌گوید تبدیل کجا انجام شده؛ ظاهرِ ورودی به‌تنهایی کافی نیست.

INTEGER عادی انعطاف بیشتری دارد

در جدول عادی، رشتهٔ 123 به integer با مقدارِ۱۲۳ تبدیل می‌شود. رشتهٔ 000123 نیز همین مقدارِ عددی را می‌گیرد و صفرهای آغازش دیگر بخشی از رشتهٔ ذخیره‌شده نیستند. عددِ۳٫۰ در این ستون به integerِ۳ تبدیل می‌شود؛ اما۳٫۵ از نوع real و xyz از نوع text باقی می‌مانند.

این رفتارِ fixture، نشان می‌دهد نوشتنِ INTEGER در جدول عادی الزاماً مانعِ ذخیرهٔ نوعِ دیگر نیست. از طرف دیگر، انعطافِ موتور، قراردادِ کسب‌وکار را خودکار درست نمی‌کند. اگر شناسه باید متنِ 000123 بماند، تبدیلِ آن به۱۲۳ ممکن است برای همان کاربرد اشتباه باشد، حتی اگر درج از دید موتور موفق شده باشد.

STRICT کدام مقدارها را رد می‌کند؟

در INTEGERِ STRICT، رشتهٔ عددی و۳٫۰ همچنان به integer تبدیل می‌شوند؛ بنابراین تعبیر «فقط object عدد صحیحِ Python می‌پذیرد» درست نیست. مستند از تلاش برای تبدیلِ بدون اتلاف مطابقِ affinity و خطای نوعِ ناسازگار سخن می‌گوید. در نمونهٔ ما،۳٫۵ و xyz با IntegrityError واقعی رد می‌شوند.

ورودیINTEGER عادیINTEGER در STRICT
رشتهٔ 000123integer؛۱۲۳integer؛۱۲۳
عددِ۳٫۰integer؛۳integer؛۳
عددِ۳٫۵real؛۳٫۵ردِ واقعی
xyztextردِ واقعی

این جدول مخصوصِ ورودی‌ها و نوعِ اعلام‌شدهٔ همین آزمایش است؛ رفتار همهٔ تبدیل‌های عددی، مقدارهای بزرگ، BLOB یا همهٔ پایگاه‌های SQL را پوشش نمی‌دهد. نسخه و متنِ خطای واقعی در JSON همراه ثبت شده‌اند.

ANY در دو نوعِ جدول یکسان نیست

در ANY عادی، رشتهٔ عددنما می‌تواند به عدد تبدیل شود؛ 000123 به integerِ۱۲۳ می‌رسد. در ANYِ STRICT، همان ورودی text با رشتهٔ دقیقِ000123 باقی می‌ماند. عددِ۳٫۰ نیز در آن مسیر real می‌ماند. این تفاوت واقعاً با دو جدول جدا و بازخوانیِ مقدار سنجیده شده است.

ANYِ STRICT به معنیِ اجرای validator معنایی برای داده نیست؛ درست‌بودنِ شماره، اعتبارِ تاریخ، مالکیتِ شناسه و مجازبودنِ caller را نمی‌فهمد. همچنین انتخاب ANY برای هر ستون صرفاً برای خاموش‌شدنِ خطا، تصمیمِ طراحیِ بی‌اثر نیست. نوع و قواعد باید از نیازِ همان فیلد بیایند.

NULL و NOT NULL را جدا آزمایش کنیم

در چهار جدولِ اصلی، ستونِ value قیدِ NOT NULL ندارد؛ پس مقدارِ NULL پذیرفته می‌شود. یک جدولِ جدا با value ANY NOT NULL و STRICT می‌سازیم و درج NULL در آن واقعاً رد می‌شود. این رفتار را به INTEGER PRIMARY KEY تعمیم نمی‌دهیم؛ آن نوعِ خاص می‌تواند قواعدِ تخصیصِ شناسهٔ متفاوتی داشته باشد و در این بخش استفاده نشده است.

تعریفِ نوع، محدودیتِ تهی‌بودن، رابطهٔ خارجی و قواعدِ تجاری چند کنترلِ جدا هستند. موفقیتِ یکی جایِ دیگری را نمی‌گیرد. تمرین فقط درج در جدول‌های تازه را انجام می‌دهد و هیچ دستورِ مهاجرت، تبدیلِ جدولِ موجود یا تعمیرِ خودکارِ دادهٔ قدیمی صادر نمی‌کند.

شاهدِ اجرا و قدم بعد

اجرای واقعی با SQLite ۳٫۵۳٫۱ و Python ۳٫۱۲٫۱۴ موجود بوده است؛ ۲۴ تلاشِ اصلیِ درج و کنترلِ جداگانهٔ NOT NULL ثبت‌اند. همهٔ جدول‌ها :memory: هستند و پس از پایان اتصال بسته می‌شود. خطای نوعِ این نمونه، وضعیتِ CRM یا پایگاهِ عملیاتیِ شما را گزارش نمی‌کند.

حفظ صفر اول در CSV مسیرِ انتقالِ رشته را توضیح می‌دهد؛ اینجا رفتارِ لایهٔ ذخیره را می‌بینیم. اجرای FOREIGN KEY نیز کنترلِ رابطه است، نه نوعِ مقدار. برای ادامه در مبانی هوش مصنوعی، ورودیِ اصلی و نوعِ بازخوانی‌شده را کنار هم نگه دارید؛ از این تمرین پشتیبانیِ SQLite یا STRICT در محصولات اپرا استنباط نمی‌شود.

فایل تمرین و منبع

کد کامل تمرینِ محلی و کنترل‌های آن · نمونه‌های اصیل و نتیجهٔ اجرای واقعیِ همین کد

منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثال‌ها و فایل‌های این راهنما آموزشی و ساختهٔ تحریریه‌اند.

برای این نیاز، کدام خدمت مناسب‌تر است؟

تماس و منشی، چت سایت و تحلیل مکالمه سه مسیر متفاوت‌اند. ابتدا خدمت متناسب نیازتان را انتخاب کنید.

انتخاب میان سه خدمتراهنمای شروع با تیم اپرا

برآورد هزینه