ฉันจะเก็บหมายเลขโทรศัพท์ใน PostgreSQL ได้อย่างไร


16

สมมติว่าฉันต้องการจัดเก็บหมายเลขโทรศัพท์ในฐานข้อมูล ฉันอาจรับหมายเลขโทรศัพท์จากนอกสหรัฐอเมริกา ฉันจะเก็บหมายเลขโทรศัพท์เหล่านี้ได้อย่างไร


1
en.wikipedia.org/wiki/E.164เป็นมาตรฐาน
Neil McGuigan

คำตอบ:


21

libphonenumber

หากเป็นไปได้ควรใช้แบบฟอร์มมาตรฐาน ยิ่งรูปแบบปกติมากเท่าไหร่ก็ยิ่งดีเท่านั้น หากมีมาตรฐานให้ใช้ สำหรับปัญหานี้ขอใช้ของ Google libphonenumberโดยพร็อกซี่ของPG-libphonenumber

CREATE EXTENSION pg_libphonenumber;

ปัจจุบันนี้ติดตั้งphone_numberชนิดที่มีตัวดำเนินการเปรียบเทียบและฟังก์ชัน มันเก็บหมายเลขในรูปแบบบัญญัติสากล นี่คือการประนีประนอมที่ดีที่สุดในความคิดของฉัน

parse_phone_number('textnumber', 'CountryCode');

เพราะเราสามารถบอกได้ว่าเมื่อใดที่หมายเลขโทรศัพท์เท่ากันและเราจัดให้มีรูปแบบปกติภายในเราสามารถทำได้ ..

SELECT parse_phone_number('03 7010 1234', 'AU') = parse_phone_number('(03) 7010 1234', 'AU');

(ส่งคืนจริง) นอกจากนี้ยังหมายถึงการใช้DISTINCTงานเพื่อให้เราสามารถทำสิ่งนี้เพื่อให้ได้ผลตามที่คุณต้องการ

CREATE TABLE foo
AS
  SELECT DISTINCT parse_phone_number(ph, 'AU')
  FROM ( VALUES
    ('0370101234'),
    ('03 7010 1234'),
    ('(03) 7010 1234')
  ) AS t(ph);
SELECT 1

นั่นแหละค่ะ

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)

8
น่าเสียดายที่แพ็คเกจดูเหมือนว่าจะอยู่ในสถานะalphaนานกว่า 1 ปี ... ขอแนะนำอย่างยิ่งถ้าคุณพยายามใช้ในการผลิต
joanolo

2
@joanolo คุณถูกต้อง แต่ดูเหมือนว่าผู้บริจาครายใหม่ Evan Carroll ได้ทำคำมั่นใหม่ในวันนี้ ... ใครบางคนจะพิจารณาการโปรโมตตัวเองในส่วนของ Evan แต่ฉันตอบโต้ด้วยตนเองเพราะเขาเป็นคนกระตือรือร้น สนับสนุนการขยาย ...
Dario

3
ฉันแค่ "บริจาค" ให้กับเอกสาร และฉันก็ทำก่อนที่จะโพสต์สิ่งนี้ในแบบเดียวกับที่ฉันเคยทำเพื่อปรับปรุงเอกสาร ฉันไม่ใช่ "ผู้มีส่วนร่วม" ในแง่ที่มีประโยชน์ใด ๆ ฉันไม่มีภาระผูกพัน ฉันไม่ได้เขียนรหัส C ++ ฉันแค่หลงใหลเกี่ยวกับการมี libphonenumber ผูกพันใน PgSQL และคนอื่น ๆ รู้เกี่ยวกับพวกเขาและวิธีการใช้พวกเขา
Evan Carroll

5
มีส่วนร่วมในเอกสารประกอบ ;) และฉันจะใช้ libphonenumber ในโครงการของฉัน (ปลอดภัยไม่สำคัญ) เนื่องจากโพสต์นี้ ขอขอบคุณ.
Dario

4
สำหรับสิ่งที่คุ้มค่าเราใช้ libphonenumber เพื่อทำให้ตัวเลขเป็นปกติก่อนที่จะเข้าสู่ฐานข้อมูลด้วยวิธีนี้เราไม่จำเป็นต้องพึ่งพาปลั๊กอิน postgres คุณภาพสูงที่มีอัลฟาซึ่งไม่สามารถใช้ใน RDS ได้ และการปรับใช้ postgres บนคลาวด์อื่น ๆ
John Hamelink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.