PostgreSQL এ কোনও ইমেল ঠিকানা সঞ্চয় করার সর্বোত্তম উপায় কী?


40

PostgreSQL এ ইমেল ঠিকানাগুলি সংরক্ষণ করার জন্য সঠিক ডেটাটাইপ কী হবে?

আমি ব্যবহার করতে পারি varchar(বা এমনকি text), তবে ইমেলগুলির জন্য আরও নির্দিষ্ট ডেটা টাইপ আছে কিনা তা অবাক করি।

উত্তর:


38

কাস্টম DOMAINএস

আমি মনে করি না citext(কেস-সংবেদনশীল) ব্যবহার করা যথেষ্ট [1] । পোস্টগ্রি ব্যবহার আমরা করতে পারেন একটি কাস্টম ডোমেইন তৈরি যা মূলত একটি ওভার কিছু সংজ্ঞায়িত সীমাবদ্ধতার হয় টাইপ । আমরা উদাহরণস্বরূপ citextটাইপ বা তারও বেশি একটি ডোমেন তৈরি করতে পারি text

এইচটিএমএল 5 type=emailস্পেক ব্যবহার করে

কোনও ই-মেইল ঠিকানা কী তা নিয়ে প্রশ্নের সর্বাধিক সঠিক উত্তর আরএফসি5322 -এ নির্দিষ্ট করা হয়েছে । এই অনুমানটি অত্যন্ত জটিল [2] , এতটাই যে সমস্ত কিছু এটি ভেঙে দেয়। এইচটিএমএল 5-এ ইমেলের জন্য আলাদা আলাদা বৈশিষ্ট রয়েছে ,

এই প্রয়োজনীয়তাটি আরএফসি 5322 এর ইচ্ছাকৃত লঙ্ঘন যা ইমেল ঠিকানাগুলির জন্য একটি সিনট্যাক্স সংজ্ঞায়িত করে যা একই সাথে খুব কড়া ("@" চরিত্রের আগে), খুব অস্পষ্ট ("@" চরিত্রের পরে), এবং খুব শিথিল (মন্তব্যের অনুমতি দেয়) , বেশিরভাগ শ্বেত স্পেসের অক্ষর এবং বেশিরভাগ ব্যবহারকারীর কাছে অপরিচিত শিষ্টাচারে উদ্ধৃত স্ট্রিংগুলি এখানে ব্যবহারিক ব্যবহারের হতে পারে। [...] নিম্নলিখিত জাভাস্ক্রিপ্ট- এবং পার্ল-সামঞ্জস্যপূর্ণ নিয়মিত প্রকাশটি উপরের সংজ্ঞাটির একটি বাস্তবায়ন।

/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/

এটি সম্ভবত আপনি যা চান এটি সম্ভবত এটি এবং HTML5 এর পক্ষে এটি যথেষ্ট ভাল তবে এটি সম্ভবত আপনার পক্ষে যথেষ্ট ভাল। আমরা পোস্টগ্র্রেএসকিউএলে সরাসরি এটি ব্যবহার করতে পারি। আমি এখানেও ব্যবহার করি citext(যার প্রযুক্তিগত অর্থ আপনি কেবলমাত্র উপরের-কেস বা লোয়ার-কেসটিকে সরিয়ে দিয়ে কিছুটা দৃষ্টিকটুভাবে রেজেক্স করতে পারেন)।

CREATE EXTENSION citext;
CREATE DOMAIN email AS citext
  CHECK ( value ~ '^[a-zA-Z0-9.!#$%&''*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$' );

এখন আপনি করতে পারেন ...

SELECT 'asdf@foobar.com'::email;

কিন্তু না

SELECT 'asdf@foob,,ar.com'::email;
SELECT 'asd@f@foobar.com'::email;

কারণ যারা দুজনেই ফিরে আসে

ERROR:  value for domain email violates check constraint "email_check"

কারণ এটিও মূল প্রতিবেদনের উপর ভিত্তি করে

SELECT 'asdf@foobar.com'::email = 'ASdf@fooBAR.com';

ডিফল্ট হিসাবে সত্য ফিরে।

ব্যবহার plperlu/Email::Valid

একটি গুরুত্বপূর্ণ নোট হিসাবে, এটি করার আরও একটি সঠিক পদ্ধতি রয়েছে যা ব্যবহার করা আরও জটিল plperlu। আপনার যদি এই স্তরের নির্ভুলতার প্রয়োজন হয় তবে আপনি চান নাcitextEmail::Validএমনকি ডোমেনটির একটি এমএক্স রেকর্ড রয়েছে কিনা তা পরীক্ষা করতে পারে (ইমেলের ডক্সে উদাহরণ: :: বৈধ) প্রথমে প্লেপারলু যুক্ত করুন (সুপারিউজার প্রয়োজন)।

CREATE EXTENSION plperlu;

তারপরে ফাংশনটি তৈরি করুন , লক্ষ্য করুন আমরা একটি হিসাবে চিহ্নিত করেছি IMMUTABLE:

CREATE FUNCTION valid_email(text)
  RETURNS boolean
  LANGUAGE plperlu
  IMMUTABLE LEAKPROOF STRICT AS
$$
  use Email::Valid;
  my $email = shift;
  Email::Valid->address($email) or die "Invalid email address: $email\n";
  return 'true';
$$;

তারপরে ডোমেনটি তৈরি করুন ,

CREATE DOMAIN validemail AS text NOT NULL
  CONSTRAINT validemail_check CHECK (valid_email(VALUE));

পাদটিকা

  1. citextপ্রযুক্তিগতভাবে ব্যবহার ভুল। এসএমটিপি local-partসংবেদনশীল হিসাবে সংজ্ঞায়িত করেছে । কিন্তু, আবার, এটি অনুমানের বোকা হওয়ার ঘটনা। এটির নিজস্ব পরিচয় সংকট রয়েছে। অনুমানে বলা হয়েছে local-part( @"এর আগে অংশ )" মেয়ের সংবেদনশীল হতে হবে "..." কেস সংবেদনশীল হিসাবে বিবেচনা করা উচিত "... এবং এখনও" মেলবাক্সের স্থানীয় অংশগুলির কেস সংবেদনশীলতা শোষণ আন্তঃব্যবযোগিতা বাধাগ্রস্থ করে এবং নিরুৎসাহিত করা হয়। "
  2. ইমেল ঠিকানার জন্য অনুমানটি এত জটিল, এটি এমনকি স্ব-অন্তর্ভুক্ত নয়। জটিল প্রকৃতপক্ষে একটি সংক্ষিপ্ত বিবরণ, যা অনুমানগুলি তৈরি করে তারা এটি বুঝতে পারে না। । নিয়মিত এক্সপ্রেশন.ডিনফোতে ডক্স থেকে

    এই রেজেক্সগুলির কোনওটিই সামগ্রিক ইমেল ঠিকানা বা স্থানীয় অংশ বা ডোমেন নামগুলিতে দৈর্ঘ্যের সীমা প্রয়োগ করে না। আরএফসি 5322 কোনও দৈর্ঘ্যের সীমাবদ্ধতা নির্দিষ্ট করে না। এসএমটিপি প্রোটোকলের মতো প্রকৃত ইমেল প্রেরণের জন্য অন্যান্য প্রোটোকলগুলিতে সীমাবদ্ধতা থেকে এই পদক্ষেপগুলি। আরএফসি 1035 সূচিত করে যে ডোমেনগুলি characters৩ টি অক্ষর বা তার চেয়ে কম হওয়া উচিত তবে এটির বাক্য গঠন বিশিষ্টতায় এটি অন্তর্ভুক্ত করে না। কারণটি হ'ল সত্যিকারের নিয়মিত ভাষা একই সাথে একটি দৈর্ঘ্যের সীমা প্রয়োগ করতে পারে না এবং একটানা হাইফেনগুলি অস্বীকার করতে পারে না।


1
ডাব্লু 3.org লিঙ্কটি নষ্ট হয়ে গেছে; এখানে একটি বিকল্প উত্স: html.spec.whatwg.org/m মাল্টিপেজ/…
ম্যাক্সগ্যাব্রিয়েল

@ ম্যাক্সগ্যাব্রিয়েল ধন্যবাদ চারপাশে, আপনি সম্পাদনাগুলি খুব শীঘ্রই পেয়ে যাবেন আমি এটি সেখানে স্থির করে নেব।
ইভান ক্যারল

উভয় a-zএবং A-Zচরিত্রের ক্লাসে থাকার কোনও কারণ আছে ?
xehpuk

@xehpuk ভাল, কারণ ~ক্ষেত্রে সংবেদনশীল আপনার হয় হয় (ক) ~*কেস সংবেদনশীল ব্যবহার করতে হবে বা (খ) চার-ক্লাসের উপরের এবং নিম্নের অক্ষরগুলি রাখতে হবে।
ইভান ক্যারল

citextএর ~, কেস-অবশ আমাকে মনে করা হয় যে কেন আমি জিজ্ঞেস করছি।
xehpuk

46

আমি সর্বদা CITEXTইমেলের জন্য ব্যবহার করি , কারণ একটি ইমেল ঠিকানা (অনুশীলনে) ক্ষেত্রে সংবেদনশীল না হয় , যেমন জন@Example.com john@example.com এর মতো।

পাঠ্যের তুলনায় সদৃশ প্রতিরোধের জন্য একটি অনন্য সূচক সেটআপ করা আরও সহজ:

-- citext
CREATE TABLE address (
   id serial primary key,
   email citext UNIQUE,
   other_stuff json
);

-- text
CREATE TABLE address (
   id serial primary key,
   email text,
   other_stuff json
);
CREATE UNIQUE INDEX ON address ((lower(email)));

ইমেলের তুলনা করাও সহজ এবং ত্রুটিগুলির প্রবণতা কম:

SELECT * FROM address WHERE email = 'JOHN@example.com';

তুলনামুলকভাবে:

SELECT * FROM address WHERE lower(email) = lower('JOHN@example.com');

CITEXT"সিটেক্সট" নামে একটি স্ট্যান্ডার্ড এক্সটেনশন মডিউলে সংজ্ঞায়িত এমন একটি টাইপ এবং টাইপ করে উপলভ্য:

CREATE EXTENSION citext;

পিএস textএবং varcharপোস্টগ্রিসে কার্যত একই এবং textএক হিসাবে প্রত্যাশিত হিসাবে ব্যবহারের জন্য কোনও জরিমানা নেই । এই উত্তরটি দেখুন: পাঠ্য এবং বারচর মধ্যে পার্থক্য


10

আমি সর্বদা varchar(254)একটি ইমেল ঠিকানা হিসাবে ব্যবহার করি 254 টি অক্ষরের চেয়ে দীর্ঘ না হতে পারে।

Https://stackoverflow.com/questions/386294/ কি- is- the- maximum- leth- of- a- uthor- email- address দেখুন

ইমেল ঠিকানাগুলির জন্য পোস্টগ্র্যাসকিএল-তে কোনও বিল্ট-ইন টাইপ নেই, যদিও আমি কিছু অবদানযুক্ত ডেটা প্রকারটি পেয়েছি।

এছাড়াও, আপনি যদি কোনও অনন্য কী যুক্ত করতে চান তবে ইমেল ঠিকানাগুলিকে মানিক করার জন্য আপনি ট্রিগার বা এ জাতীয় কিছু যুক্তি যুক্ত করতে চাইতে পারেন।

বিশেষত, domainইমেল ঠিকানার অংশটি (যা ফর্ম local-part@ এর আকারটি domainসংবেদনশীল এবং এটি কেস সংবেদনশীল local-partহিসাবে বিবেচনা করা উচিত http:// http://tools.ietf.org/html/rfc5321#section-2.4 দেখুন

আরেকটি বিবেচনা হ'ল আপনি যদি ফর্মটিতে নাম এবং ইমেল ঠিকানা সঞ্চয় করতে চান তবে এই "Joe Bloggs" <joe.bloggs@hotmail.com>ক্ষেত্রে আপনার 254 টির চেয়ে বেশি অক্ষরের চেয়ে বেশি স্ট্রিং দরকার এবং আপনি অর্থপূর্ণভাবে একটি অনন্য বাধা ব্যবহার করতে সক্ষম হবেন না। আমি এটি করব না এবং নাম এবং ইমেল ঠিকানা আলাদাভাবে সঞ্চয় করার পরামর্শ দেব। এই বিন্যাসে সুন্দর মুদ্রণ ঠিকানাগুলি আপনার উপস্থাপনা স্তরে সর্বদা সম্ভব।


4.5.3.1 অনুযায়ী আকার সীমা এবং সর্বনিম্ন , সর্বাধিক দৈর্ঘ্য 320 অক্ষর (সহ @)।
অ্যান্ড্রি এম

1
@ অ্যান্ড্রিএম রেফারেন্স বিভাগে এমন কিছুই নেই যা 320 বলে। আর যাইহোক এটি ভুল; সরঞ্জাম.এইটিএফ.আর.এফ.আর.এফ.এফ.এফ.এইচটিএম / আরএফসি ৫৩২২# সেকশন ৪.৫.৩.৩.২ বলেছে যে কোনও পথের সর্বাধিক দৈর্ঘ্য 256 অক্ষর এবং এতে পার্শ্ববর্তী "<" এবং ">" সর্বাধিক 254 তৈরি করতে হবে
কলিন 'হার্ট

আমি ৪.২.৩.১.১ ("ব্যবহারকারীর নাম বা অন্যান্য স্থানীয় অংশের সর্বাধিক মোট দৈর্ঘ্য ৪ অক্টেট") এবং 4.5.3.1.2 ("একটি ডোমেন নামের সর্বোচ্চ মোট দৈর্ঘ্য) এর ভিত্তিতে সর্বোচ্চ হিসাবে 320 এ পৌঁছেছি বা সংখ্যাটি 255 অক্টেট ")। সুতরাং, 64 + 255 + 1 (the @) = 320 Perhaps সম্ভবত আমি এটির ভুল ব্যাখ্যা দিচ্ছি।
অ্যান্ড্রি এম

3
@ অ্যান্ড্রিএম আমি যে প্রশ্নের সাথে সংযুক্ত করেছি তার গ্রহণযোগ্য উত্তরটি পড়ুন। এটি সব ব্যাখ্যা করে। এটি অবশ্যই 254, 320 নয়
কলিন 'হার্ট

3

আপনি একটি চেক কনট্রান্সট ব্যবহার করতে আগ্রহী হতে পারেন (সম্ভবত সহজ, তবে আপনি যা চান তার চেয়ে বেশি প্রত্যাখ্যান করতে পারেন, বা আপনি এখানে এবং এখানে আলোচিত একটি ফাংশন ব্যবহার করেন । মূলত, এটি নির্দিষ্টকরণ এবং বাস্তবায়নের স্বাচ্ছন্দ্যের মধ্যে ট্রেডঅফস সম্পর্কেই আকর্ষণীয় বিষয় topic যদিও। পোস্টগ্রি এমনকি একটি নেটিভ IP ঠিকানা টাইপ করুন আছে, কিন্তু একটি ইমেল ডাটা টাইপ জন্য pgfoundry উপর একটি প্রকল্প আছে এখানে । যাইহোক, শ্রেষ্ঠ আমি এই সম্পর্কে পাওয়া একটি ইমেল ডোমেইন। ডোমেন একটি চেক সীমাবদ্ধতার চেয়ে ভাল কারণ আপনি যদি এটি পরিবর্তন করেন তবে আপনাকে কেবল এটি ডোমেন সংজ্ঞায় একবার করতে হবে এবং আপনার সমস্ত চেকের সীমাবদ্ধতাগুলি পরিবর্তন করে পিতা-সন্তানের টেবিলগুলি অনুসরণ করে অনুসরণ করতে হবে না। ডোমেনগুলি সত্যিই দুর্দান্ত - ডেটা টাইপের মতো কিন্ডা, তবে প্রয়োগ করা সহজ। আমি সেগুলি ফায়ারবার্ডে ব্যবহার করেছি - ওরাকল এমনকি তাদেরও নেই!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.