کپی داده ها را بین جداول PostgreSQL و پرونده های سیستم استاندارد فایل حرکت می دهد. کپی کردن محتویات یک جدول در یک پرونده ، در حالی که از کپی کردن داده ها از یک پرونده به یک جدول کپی می کند (داده ها را به هر آنچه در جدول است ، اضافه کنید). کپی کنید همچنین می تواند نتایج یک پرس و جو انتخابی را کپی کند.
اگر لیست ستون مشخص شده است ، فقط داده ها را در ستون های مشخص شده در پرونده کپی کنید. برای کپی از ، هر قسمت در پرونده ، به ترتیب ، در ستون مشخص شده قرار می گیرد. ستونهای جدول که در کپی از لیست ستون مشخص نشده اند ، مقادیر پیش فرض خود را دریافت می کنند.
کپی با یک نام پرونده به سرور postgresql دستور می دهد تا مستقیماً از یک پرونده بخواند یا بنویسید. پرونده باید توسط کاربر PostgreSQL قابل دسترسی باشد (شناسه کاربری سرور آن را اجرا می کند) و نام باید از دیدگاه سرور مشخص شود. هنگامی که برنامه مشخص شده است ، سرور دستور داده شده را اجرا می کند و از خروجی استاندارد برنامه می خواند ، یا به ورودی استاندارد برنامه می نویسد. دستور باید از دیدگاه سرور مشخص شود و توسط کاربر PostgreSQL قابل اجرا باشد. هنگامی که STDIN یا STDOUT مشخص شده است ، داده ها از طریق اتصال بین مشتری و سرور منتقل می شوند.
هر کپی در حال اجرا در حال اجرا ، پیشرفت خود را در نمای PG_STAT_PROGRESS_COPY گزارش می دهد. برای جزئیات بیشتر به بخش 28. 4. 6 مراجعه کنید.
مولفه های
نام (به صورت اختیاری شمای واجد شرایط) از یک جدول موجود.
لیست اختیاری از ستون ها که باید کپی شوند. اگر لیست ستون مشخص نشده باشد ، تمام ستون های جدول به جز ستون های تولید شده کپی می شوند.
یک فرمان انتخاب ، مقادیر ، درج ، به روزرسانی یا حذف دستور که نتایج آن کپی می شود. توجه داشته باشید که پرانتز در اطراف پرس و جو مورد نیاز است.
برای درج ، به روزرسانی و حذف پرس و جوهای یک بند بازگشت باید ارائه شود ، و رابطه هدف نباید یک قاعده مشروط داشته باشد ، نه یک قانون و نه در عوض یک قانون که به چندین بیانیه گسترش یابد.
نام مسیر پرونده ورودی یا خروجی. نام پرونده ورودی می تواند یک مسیر مطلق یا نسبی باشد ، اما یک نام پرونده خروجی باید یک مسیر مطلق باشد. کاربران ویندوز ممکن است نیاز به استفاده از رشته E 'داشته باشند و هرگونه پشتی مورد استفاده در نام مسیر را دو برابر کنند.
یک دستور برای اجرایدر کپی از ، ورودی از خروجی استاندارد دستور خوانده می شود ، و به صورت کپی ، خروجی به ورودی استاندارد دستور نوشته شده است.
توجه داشته باشید که این دستور توسط پوسته فراخوانی شده است ، بنابراین اگر شما نیاز به تصویب هرگونه آرگومان برای فرمان پوسته ای که از یک منبع غیرقابل اعتماد است ، باید مراقب باشید که از شخصیت های خاصی که ممکن است معنای خاصی برای پوسته داشته باشد ، از بین برود یا فرار کند. به دلایل امنیتی ، بهتر است از یک رشته فرمان ثابت استفاده کنید ، یا حداقل از عبور از ورودی کاربر در آن خودداری کنید.
مشخص می کند که ورودی از برنامه مشتری حاصل می شود.
مشخص می کند که خروجی به برنامه مشتری می رود.
مشخص می کند که آیا گزینه انتخاب شده باید روشن یا خاموش باشد. برای فعال کردن گزینه و کاذب ، خاموش یا 0 برای غیرفعال کردن آن می توانید درست ، روی یا 1 بنویسید. مقدار بولی نیز می تواند حذف شود ، که در این صورت درست فرض می شود.
قالب داده را برای خواندن یا نوشتن انتخاب می کند: متن ، CSV (مقادیر جدا شده کاما) یا باینری. پیش فرض متن است.
درخواست کپی کردن داده ها با ردیف هایی که قبلاً منجمد شده اند ، دقیقاً همانطور که می توانند بعد از اجرای دستور یخ خلاء انجام شوند. این به عنوان یک گزینه عملکرد برای بارگذاری داده های اولیه در نظر گرفته شده است. ردیف ها فقط در صورتی که جدول بارگیری شده یا در زیر مجموعه فعلی ایجاد شده یا کوتاه شود ، منجمد می شود ، هیچ مکان نما باز نیست و هیچ عکس قدیمی قدیمی در این معامله وجود ندارد. در حال حاضر امکان انجام یخبندان کپی در یک جدول تقسیم شده امکان پذیر نیست.
توجه داشته باشید که تمام جلسات دیگر بلافاصله قادر به دیدن داده ها پس از بارگیری موفقیت آمیز است. این امر قوانین عادی دید MVCC را نقض می کند و کاربران مشخص شده باید از مشکلات احتمالی این امر آگاه باشند.
شخصیتی را که ستون ها را در هر سطر (خط) پرونده جدا می کند ، مشخص می کند. پیش فرض یک شخصیت TAB در قالب متن ، کاما در قالب CSV است. این باید یک شخصیت یک بایت باشد. این گزینه هنگام استفاده از قالب باینری مجاز نیست.
رشته ای را نشان می دهد که یک مقدار تهی را نشان می دهد. پیش فرض \ n (backslash-n) در قالب متن و یک رشته خالی بدون سیم در قالب CSV است. شما ممکن است یک رشته خالی حتی در قالب متن را برای مواردی که نمی خواهید تهی ها را از رشته های خالی متمایز کنید ، ترجیح دهید. این گزینه هنگام استفاده از قالب باینری مجاز نیست.
هنگام استفاده از Copy From ، هر مورد داده ای که با این رشته مطابقت داشته باشد به عنوان یک مقدار تهی ذخیره می شود ، بنابراین باید مطمئن شوید که از همان رشته ای که با کپی استفاده کرده اید استفاده می کنید.
مشخص می کند که فایل حاوی یک خط سرصفحه با نام هر ستون در فایل باشد. در خروجی، خط اول شامل نام ستون ها از جدول است. در ورودی، وقتی این گزینه روی true (یا مقدار بولی معادل) تنظیم شود، خط اول کنار گذاشته می شود. اگر این گزینه روی MATCH تنظیم شده باشد، تعداد و نام ستونها در خط سرصفحه باید به ترتیب با نام ستونهای واقعی جدول مطابقت داشته باشد. در غیر این صورت یک خطا مطرح می شود. این گزینه در هنگام استفاده از فرمت باینری مجاز نیست. گزینه MATCH فقط برای دستورات COPY FROM معتبر است.
کاراکتر نقل قول را مشخص می کند که هنگام نقل قول یک مقدار داده استفاده شود. پیش فرض دو نقل قول است. این باید یک کاراکتر تک بایتی باشد. این گزینه فقط در صورت استفاده از فرمت CSV مجاز است.
کاراکتری را مشخص می کند که باید قبل از یک کاراکتر داده ای که با مقدار QUOTE مطابقت دارد ظاهر شود. مقدار پیش فرض همان مقدار QUOTE است (به طوری که اگر کاراکتر نقل قول در داده ها ظاهر شود دو برابر می شود). این باید یک کاراکتر تک بایتی باشد. این گزینه فقط در صورت استفاده از فرمت CSV مجاز است.
نقل قول را مجبور می کند برای همه مقادیر غیر NULL در هر ستون مشخص شده استفاده شود. خروجی NULL هرگز نقل قول نمی شود. اگر * مشخص شده باشد، مقادیر غیر NULL در همه ستون ها نقل قول می شود. این گزینه فقط در COPY TO و فقط در صورت استفاده از فرمت CSV مجاز است.
مقادیر ستون های مشخص شده را با رشته تهی مطابقت ندهید. در حالت پیشفرض که رشته تهی خالی است، به این معنی است که مقادیر خالی بهعنوان رشتههایی با طول صفر خوانده میشوند تا بهعنوان رشتههای تهی، حتی زمانی که نقل قول نشده باشند. این گزینه فقط در COPY FROM و فقط در صورت استفاده از فرمت CSV مجاز است.
مقادیر ستون های مشخص شده را با رشته تهی مطابقت دهید، حتی اگر نقل قول شده باشد، و اگر مطابقت یافت شد، مقدار را NULL قرار دهید. در حالت پیش فرض که رشته تهی خالی است، یک رشته خالی نقل قول شده را به NULL تبدیل می کند. این گزینه فقط در COPY FROM و فقط در صورت استفاده از فرمت CSV مجاز است.
مشخص می کند که فایل در encoding_name کدگذاری شده است. اگر این گزینه حذف شود، از رمزگذاری مشتری فعلی استفاده می شود. برای جزئیات بیشتر به یادداشت های زیر مراجعه کنید.
بند اختیاری WHERE شکل کلی دارد
که در آن شرط هر عبارتی است که به یک نتیجه از نوع بولی ارزیابی می شود. هر ردیفی که این شرط را برآورده نکند در جدول درج نخواهد شد. یک ردیف شرط را برآورده می کند اگر زمانی که مقادیر واقعی ردیف به جای هر مرجع متغیری جایگزین شود، مقدار true را برگرداند.
در حال حاضر، درخواستهای فرعی در عبارات WHERE مجاز نیستند، و ارزیابی هیچ تغییری را که توسط خود COPY ایجاد شده است مشاهده نمیکند (این موضوع زمانی مهم است که عبارت شامل فراخوانیهای توابع VOLATILE باشد).
خروجی ها
پس از تکمیل موفقیت آمیز، یک دستور COPY یک تگ فرمان از فرم را برمی گرداند
شمارش تعداد ردیف های کپی شده است.
psql این تگ فرمان را فقط در صورتی چاپ می کند که دستور COPY نباشد. TO STDOUT، یا متافرمان psql \copy . به stdout شدن . این برای جلوگیری از اشتباه گرفتن تگ فرمان با داده هایی است که به تازگی چاپ شده است.
یادداشت
COPY TO را می توان فقط با جداول ساده استفاده کرد، نه نماها، و ردیف هایی را از جداول فرزند یا پارتیشن های فرزند کپی نمی کند. برای مثال، جدول COPY TO همان ردیفهای جدول SELECT * FROM ONLY را کپی میکند. نحو COPY (انتخاب * از جدول ) به . می توان از آن برای حذف همه ردیف ها در یک سلسله مراتب ارثی، جدول پارتیشن بندی شده یا نمای استفاده کرد.
COPY FROM را می توان با جداول ساده، خارجی یا پارتیشن بندی شده یا با نماهایی که دارای محرک های INSEAD OF INSERT هستند استفاده کرد.
شما باید در جدولی که مقادیر آن توسط COPY TO خوانده می شود، امتیاز را انتخاب کنید و در جدولی که مقادیر توسط COPY FROM در آن درج شده است، امتیاز را وارد کنید. داشتن امتیازات ستون در ستون(های) فهرست شده در فرمان کافی است.
اگر امنیت در سطح ردیف برای جدول فعال باشد، خط مشی های SELECT مربوطه برای دستورات جدول COPY TO اعمال می شود. در حال حاضر، COPY FROM برای جداول با امنیت در سطح ردیف پشتیبانی نمی شود. به جای آن از عبارات INSERT معادل استفاده کنید.
فایل هایی که در یک دستور COPY نامگذاری شده اند مستقیماً توسط سرور خوانده یا نوشته می شوند نه توسط برنامه مشتری. بنابراین، آنها باید در دستگاه سرور پایگاه داده ساکن باشند یا در دسترس باشند، نه مشتری. آنها باید برای کاربر PostgreSQL قابل دسترسی و خواندن یا نوشتن باشند (شناسه کاربری که سرور به عنوان اجرا می شود)، نه مشتری. به طور مشابه، دستور مشخص شده با PROGRAM مستقیماً توسط سرور اجرا می شود، نه توسط برنامه مشتری، باید توسط کاربر PostgreSQL قابل اجرا باشد. کپی نامگذاری یک فایل یا دستور فقط برای ابرکاربران پایگاه داده یا کاربرانی مجاز است که یکی از نقشهای pg_read_server_files، pg_write_server_files، یا pg_execute_server_program را دارند، زیرا اجازه خواندن یا نوشتن هر فایل یا اجرای برنامهای را میدهد که سرور امتیاز دسترسی به آن را دارد.
COPY را با دستور psql \copy اشتباه نگیرید.\copy COPY FROM STDIN یا COPY TO STDOUT را فراخوانی می کند و سپس داده ها را در یک فایل قابل دسترسی برای کلاینت psql واکشی/ذخیره می کند. بنابراین، دسترسی به فایل و حقوق دسترسی در هنگام استفاده از \copy به جای سرور به مشتری بستگی دارد.
توصیه می شود نام فایل مورد استفاده در COPY همیشه به عنوان یک مسیر مطلق مشخص شود. این در مورد COPY TO توسط سرور اعمال می شود، اما برای COPY FROM شما می توانید از فایلی که توسط یک مسیر نسبی مشخص شده است، بخوانید. مسیر نسبت به دایرکتوری کاری فرآیند سرور (معمولا دایرکتوری داده های خوشه) تفسیر می شود، نه دایرکتوری کاری مشتری.
اجرای یک فرمان با PROGRAM ممکن است توسط مکانیسم های کنترل دسترسی سیستم عامل، مانند SELinux، محدود شود.
COPY FROM هر عاملی را فراخوانی می کند و محدودیت ها را در جدول مقصد بررسی می کند. با این حال، قوانین را احضار نخواهد کرد.
برای ستون های هویت، دستور COPY FROM همیشه مقادیر ستون های ارائه شده در داده های ورودی را می نویسد، مانند گزینه INSERT OVERRIDING SYSTEM VALUE .
ورودی و خروجی COPY تحت تأثیر DateStyle است. برای اطمینان از قابلیت حمل به سایر نصبهای PostgreSQL که ممکن است از تنظیمات غیر پیشفرض DateStyle استفاده کنند، DateStyle باید قبل از استفاده از COPY TO روی ISO تنظیم شود. همچنین ایده خوبی است که از ریختن داده ها با IntervalStyle که روی sql_standard تنظیم شده است خودداری کنید، زیرا مقادیر بازه منفی ممکن است توسط سروری که تنظیمات متفاوتی برای IntervalStyle دارد، اشتباه تفسیر شود.
دادههای ورودی بر اساس گزینه ENCODING یا رمزگذاری مشتری فعلی تفسیر میشوند و دادههای خروجی در ENCODING یا رمزگذاری مشتری فعلی کدگذاری میشوند، حتی اگر دادهها از طریق کلاینت عبور نکنند، اما مستقیماً توسط سرور از فایل خوانده یا روی آن نوشته شوند..
COPY در اولین خطا عملیات را متوقف می کند. این نباید در صورت کپی کردن به مشکل منجر شود، اما جدول هدف قبلاً ردیف های قبلی را در یک COPY FROM دریافت کرده است. این ردیف ها قابل مشاهده یا قابل دسترسی نخواهند بود، اما همچنان فضای دیسک را اشغال می کنند. اگر خرابی در یک عملیات کپی بزرگ اتفاق بیفتد، ممکن است مقدار قابل توجهی از فضای دیسک تلف شود. ممکن است بخواهید از VACUUM برای بازیابی فضای تلف شده استفاده کنید.
FORCE_NULL و FORCE_NOT_NULL را می توان به طور همزمان در یک ستون استفاده کرد. این منجر به تبدیل رشته های تهی نقل قول به مقادیر تهی و رشته های تهی نقل قول نشده به رشته های خالی می شود.
فرمت های فایل
فرمت متن
هنگامی که از قالب متن استفاده می شود ، داده های خوانده شده یا نوشته شده یک فایل متنی با یک خط در هر ردیف جدول است. ستون های یک ردیف توسط شخصیت تعیین کننده از هم جدا می شوند. مقادیر ستون خود رشته هایی است که توسط عملکرد خروجی تولید می شوند یا برای عملکرد ورودی از نوع داده هر ویژگی قابل قبول هستند. رشته تهی مشخص شده به جای ستون هایی که تهی هستند استفاده می شود. در صورتی که هر خط از پرونده ورودی حاوی ستون های بیشتر یا کمتر از آنچه انتظار می رود ، کپی خطایی را ایجاد می کند.
انتهای داده ها را می توان با یک خط واحد حاوی فقط پشت پرده (\.) نشان داد. یک نشانگر پایان داده هنگام خواندن از یک پرونده ضروری نیست ، زیرا پایان پرونده کاملاً خوب عمل می کند. فقط در هنگام کپی کردن داده ها به برنامه های مشتری یا از طریق پروتکل مشتری قبل از 3. 0 لازم است.
کاراکترهای backslash (\) را می توان در داده های کپی برای نقل قول کاراکترهای داده ای که در غیر این صورت ممکن است به عنوان تعیین کننده ردیف یا ستون در نظر گرفته شود ، استفاده کرد. به طور خاص ، در صورت ظاهر شدن به عنوان بخشی از یک مقدار ستون ، باید شخصیت های زیر قبل از یک پشتی قرار بگیرند: خود Backslash ، Newline ، بازگشت کالسکه و شخصیت تعیین کننده فعلی.
رشته تهی مشخص شده توسط کپی به بدون اضافه کردن هرگونه backslashes ارسال می شود. برعکس ، کپی از ورودی در برابر رشته تهی قبل از حذف backslashes. بنابراین ، یک رشته تهی مانند \ n را نمی توان با مقدار واقعی داده \ n (که به عنوان \\ n نشان داده می شود) اشتباه گرفت.
توالی های ویژه Backslash با کپی از:
توالی | نماینده |
---|---|
\b | فضای پشتی (ASCII 8) |
\f | خوراک فرم (ASCII 12) |
\n | Newline (ASCII 10) |
\r | بازگشت کالسکه (ASCII 13) |
\t | برگه (ASCII 9) |
\v | برگه عمودی (ASCII 11) |
\ رقم | backslash و به دنبال آن یک تا سه رقم اکتال بایت را با آن کد عددی مشخص می کند |
\ x رقم | backslash x و به دنبال یک یا دو رقم هگزا بایت را با آن کد عددی مشخص می کند |
در حال حاضر ، Copy to هرگز توالی backslash هشت هشت ضلعی یا Hex را منتشر نمی کند ، اما از توالی های دیگر ذکر شده در بالا برای آن شخصیت های کنترل استفاده می کند.
هر شخصیتی دیگر که در جدول فوق ذکر نشده است ، برای نمایندگی خود گرفته می شود. با این حال ، از اضافه کردن backslashes به طور غیر ضروری ، مراقب باشید ، زیرا ممکن است به طور تصادفی رشته ای را با نشانگر انتهای داده (\.) یا رشته تهی (\ n به طور پیش فرض) تولید کند. این رشته ها قبل از انجام هرگونه پردازش پشتی دیگر به رسمیت شناخته می شوند.
اکیداً توصیه میشود که برنامههایی که دادههای COPY تولید میکنند، خطوط جدید دادهها را به ترتیب به دنبالههای
و
تبدیل کنند. در حال حاضر می توان یک بازگشت داده را با یک بک اسلش و بازده حمل و نقل و یک خط جدید داده را با یک بک اسلش و یک خط جدید نشان داد. با این حال، این نمایندگی ها ممکن است در نسخه های بعدی پذیرفته نشوند. همچنین اگر فایل COPY در ماشین های مختلف (مثلاً از یونیکس به ویندوز یا بالعکس) منتقل شود، در برابر فساد بسیار آسیب پذیر هستند.
همه دنبالههای اسلش پس از تبدیل کدگذاری تفسیر میشوند. بایت های مشخص شده با دنباله های بک اسلش هشت رقمی و شش رقمی باید کاراکترهای معتبری را در رمزگذاری پایگاه داده تشکیل دهند.
COPY TO هر ردیف را با یک خط جدید به سبک یونیکس خاتمه می دهد ( "
" ). سرورهایی که در ویندوز مایکروسافت اجرا میشوند، به جای آن خروجی carriage return/newline ( "
" )، اما فقط برای کپی در فایل سرور. برای سازگاری در بین پلتفرمها، COPY TO STDOUT همیشه بدون توجه به پلتفرم سرور، «
» را ارسال میکند. COPY FROM میتواند خطوطی را که به خطوط جدید ختم میشوند، برگردانده حمل و نقل یا بازگشت/خطهای جدید حمل و نقل انجام دهد. برای کاهش خطر خطا به دلیل خطوط جدید بدون علامت معکوس یا برگشتهای حمل که بهعنوان داده در نظر گرفته شدهاند، اگر پایانهای خط در ورودی همه یکسان نباشد، COPY FROM شکایت خواهد کرد.
فرمت CSV
این گزینه قالب برای وارد کردن و صادر کردن فرمت فایل با کاما Separated Value (CSV) مورد استفاده بسیاری از برنامههای دیگر مانند صفحات گسترده استفاده میشود. به جای قوانین فرار استفاده شده توسط قالب متن استاندارد PostgreSQL، مکانیسم رایج فرار CSV را تولید و تشخیص می دهد.
مقادیر در هر رکورد با کاراکتر DELIMITER از هم جدا می شوند. اگر مقدار شامل کاراکتر جداکننده، کاراکتر QUOTE، رشته NULL، یک بازگشت حامل یا کاراکتر تغذیه خط باشد، کل مقدار با پیشوند و پسوند کاراکتر QUOTE و هر رخدادی در مقدار یک کاراکتر QUOTE یاقبل از کاراکتر ESCAPE کاراکتر فرار قرار می گیرد. همچنین می توانید از FORCE_QUOTE برای اجبار نقل قول ها هنگام خروجی مقادیر غیر NULL در ستون های خاص استفاده کنید.
فرمت CSV هیچ روش استانداردی برای تمایز مقدار تهی از یک رشته خالی ندارد. کپی PostgreSQL با نقل قول این کار را انجام می دهد. NULL به عنوان رشته پارامتر تهی و نقل نشده است ، در حالی که یک مقدار غیر تهی مطابق با رشته پارامتر تهی نقل شده است. به عنوان مثال ، با تنظیمات پیش فرض ، NULL به عنوان یک رشته خالی غیرقابل استفاده نوشته شده است ، در حالی که یک مقدار داده رشته خالی با نقل قول های مضاعف ("") نوشته شده است. مقادیر خواندن از قوانین مشابه پیروی می کند. برای جلوگیری از مقایسه ورودی تهی برای ستون های خاص می توانید از Force_not_null استفاده کنید. همچنین می توانید از Force_null برای تبدیل مقادیر داده های NULL رشته به NULL استفاده کنید.
از آنجا که backslash شخصیت خاصی در قالب CSV نیست ، \.، نشانگر پایان داده ، همچنین می تواند به عنوان یک مقدار داده ظاهر شود. برای جلوگیری از هرگونه تفسیر نادرست ، \. مقدار داده که به عنوان یک ورودی تنها در یک خط ظاهر می شود ، به طور خودکار در خروجی نقل می شود و در صورت ذکر ، به عنوان نشانگر انتهای داده تفسیر نمی شود. اگر در حال بارگیری فایل ایجاد شده توسط برنامه دیگری هستید که دارای یک ستون بدون سیم است و ممکن است مقدار \ داشته باشد.، ممکن است لازم باشد این مقدار را در پرونده ورودی نقل کنید.
در قالب CSV ، همه شخصیت ها قابل توجه هستند. یک مقدار نقل شده احاطه شده توسط فضای سفید یا هر شخصیت غیر از تعیین کننده ، شامل آن شخصیت ها خواهد بود. اگر داده ها را از سیستمی وارد کنید که خطوط CSV را با فضای سفید به برخی از عرض ثابت وارد کنید ، می تواند باعث ایجاد خطاها شود. در صورت بروز چنین شرایطی ، ممکن است قبل از وارد کردن داده ها به PostgreSQL ، پرونده CSV را از پیش پردازش کنید تا فضای سفید را حذف کنید.
فرمت CSV هم فایلهای CSV را با مقادیر نقل شده حاوی بازده کالسکه تعبیه شده و فیدهای خط تشخیص داده و تولید می کند. بنابراین پرونده ها کاملاً یک خط در هر ردیف جدول مانند پرونده های با فرمت متن نیستند.
بسیاری از برنامه ها فایلهای CSV عجیب و غریب و گاه به گاه تولید می کنند ، بنابراین قالب پرونده بیشتر از یک استاندارد است. بنابراین ممکن است با برخی از پرونده ها روبرو شوید که با استفاده از این مکانیسم نمی توانند وارد شوند ، و کپی ممکن است پرونده هایی را تولید کند که برنامه های دیگر نمی توانند پردازش کنند.
قالب دودویی
گزینه Format Binary باعث می شود که تمام داده ها به جای متن به عنوان قالب باینری ذخیره و خوانده شوند. این تا حدودی سریعتر از قالب های متن و CSV است ، اما یک فایل با دودویی در بین معماری های دستگاه و نسخه های PostgreSQL قابل حمل است. همچنین ، قالب باینری از نوع داده بسیار خاص است. به عنوان مثال ، این کار برای خروجی داده های باینری از یک ستون کوچک و خواندن آن در یک ستون عدد صحیح کار نخواهد کرد ، حتی اگر این کار در قالب متن خوب باشد.
فرمت پرونده باینری شامل یک هدر پرونده ، صفر یا بیشتر Tuples حاوی داده های ردیف و یک تریلر پرونده است. هدرها و داده ها به ترتیب بایت شبکه هستند.
نسخه های PostgreSQL قبل از 7. 4 از فرمت فایل باینری متفاوت استفاده می کردند.
هدر پرونده
هدر پرونده شامل 15 بایت از زمینه های ثابت است و به دنبال آن یک منطقه پسوند هدر متغیر است. زمینه های ثابت عبارتند از:
دنباله 11 بایت pgcopy \ n \ 377 \ r \ n \ 0-توجه داشته باشید که بایت صفر بخشی مورد نیاز امضا است.(این امضا به گونه ای طراحی شده است که امکان شناسایی آسان پرونده هایی را فراهم کند که توسط یک انتقال غیر تمیز و تمیز انجام شده است. این امضای با فیلترهای پایان خط به خط تغییر می یابد ، بایت صفر کاهش یافته ، بیت های بالایی کاهش یافته است ، یابرابری تغییر می کند.)
اگر 1 ، OID ها در داده ها گنجانده شده اند. اگر 0 ، نهستون های سیستم OID دیگر در PostgreSQL پشتیبانی نمی شوند ، اما این قالب هنوز حاوی نشانگر است.
عدد صحیح 32 بیتی ، طول در بایت های باقیمانده هدر ، از جمله خود نیست. در حال حاضر ، این صفر است ، و اولین Tuple بلافاصله دنبال می شود. تغییرات آینده در قالب ممکن است اجازه دهد داده های اضافی در هدر وجود داشته باشد. یک خواننده باید بی صدا از هر داده پسوند هدر که نمی داند با چه کاری انجام دهد ، پرش کند.
پیش بینی می شود که منطقه پسوند هدر شامل دنباله ای از تکه های خود شناسایی باشد. قسمت Flags در نظر گرفته نشده است تا به خوانندگان بگوید که در منطقه پسوند چیست. طراحی خاص محتوای پسوند هدر برای انتشار بعدی باقی مانده است.
این طرح امکان اضافه کردن هدر های سازگار با عقب را فراهم می کند (قسمت های افزودنی هدر را اضافه کنید ، یا بیت های پرچم مرتبه کم را تنظیم کنید) و تغییرات سازگار با عدم عقب (تنظیم بیت های پرچم مرتبه بالا برای سیگنال چنین تغییراتی ، و اضافه کردن داده های پشتیبانی به پسونددر صورت نیاز منطقه).
کله
هر Tuple با تعداد عدد صحیح 16 بیتی از تعداد زمینه های موجود در Tuple شروع می شود.(در حال حاضر ، تمام Tuples در یک جدول تعداد یکسان را خواهند داشت ، اما ممکن است همیشه درست نباشد.) سپس ، برای هر زمینه در Tuple تکرار می شود ، یک کلمه طول 32 بیتی وجود دارد که به دنبال آن بسیاری از داده های فیلد وجود دارد.(کلمه طول خود را شامل نمی شود و می تواند صفر باشد.) به عنوان یک مورد خاص ، -1 مقدار فیلد تهی را نشان می دهد. هیچ بایت ارزش در مورد تهی دنبال نمی شود.
هیچ بالشتک تراز یا داده های اضافی دیگری بین زمینه ها وجود ندارد.
در حال حاضر ، تمام مقادیر داده در یک پرونده با دودویی فرض می شود که در قالب باینری (کد فرمت یک) قرار دارند. پیش بینی می شود که یک برنامه افزودنی آینده ممکن است یک قسمت هدر را اضافه کند که اجازه می دهد کدهای قالب هر ستون مشخص شود.
برای تعیین قالب باینری مناسب برای داده های واقعی Tuple ، باید با منبع PostgreSQL ، به ویژه توابع SEND و *RECV برای نوع داده هر ستون مشورت کنید (به طور معمول این توابع در SRC/Backend/UTILS/ADT/DIRECTORY یافت می شوندتوزیع منبع).
اگر OID ها در پرونده گنجانده شده باشند ، قسمت OID بلافاصله کلمه شمارش را دنبال می کند. این یک زمینه عادی است به جز این که در بخش مزرعه گنجانده نشده است. توجه داشته باشید که ستون های سیستم OID در نسخه های فعلی PostgreSQL پشتیبانی نمی شوند.
همگروه
تریلر پرونده از یک کلمه عدد صحیح 16 بیتی حاو ی-1 تشکیل شده است. این به راحتی از کلمه شمارش میدان Tuple متمایز می شود.
خواننده اگر یک کلمه در زمینه فیلد ن ه-1 باشد و نه تعداد مورد انتظار ستون ها باید خطایی را گزارش کند. این یک بررسی اضافی در برابر خارج شدن از همگام سازی با داده ها فراهم می کند.
مثال ها
مثال زیر یک جدول را با استفاده از نوار عمودی (|) به عنوان تعیین کننده زمینه برای مشتری کپی می کند:
برای کپی کردن داده ها از یک پرونده در جدول کشور:
برای کپی کردن در پرونده فقط کشورهایی که نام آنها با "A" شروع می شود:
برای کپی کردن در یک فایل فشرده شده ، می توانید خروجی را از طریق یک برنامه فشرده سازی خارجی لوله کشی کنید:
در اینجا نمونه ای از داده های مناسب برای کپی کردن در یک جدول از stdin:
توجه داشته باشید که فضای سفید در هر خط در واقع یک شخصیت برگه است.
در زیر همان داده ها ، خروجی با فرمت باینری است. داده ها پس از فیلتر کردن از طریق ابزار UNIX O D-C نشان داده شده است. جدول دارای سه ستون است. حالت اول دارای نوع کاراکتر (2) ، دوم متن نوع و سوم دارای نوع عدد صحیح است. تمام ردیف ها در ستون سوم مقدار تهی دارند.
سازگاری
هیچ بیانیه ای در استاندارد SQL وجود ندارد. | Up | نحو زیر قبل از نسخه 9. 0 PostgreSQL استفاده شده است و هنوز هم پشتیبانی می شود: |
توجه داشته باشید که در این نحو ، باینری و CSV به عنوان کلمات کلیدی مستقل رفتار می شوند ، نه به عنوان آرگومان یک گزینه فرمت. | نحو زیر قبل از نسخه 7. 3 PostgreSQL استفاده شده است و هنوز هم پشتیبانی می شود: | همچنین ببینید |
سعادت
بعد