Bagaimana cara menyimpan nomor telepon di PostgreSQL?

Jawaban:

21

libphonenumber

Bila memungkinkan selalu gunakan bentuk kanonik. Semakin dinormalisasi bentuknya semakin baik. Jika ada standar, gunakan itu. Untuk masalah ini, mari gunakan Google libphonenumber , dengan proksi pg-libphonenumber .

CREATE EXTENSION pg_libphonenumber;

Saat ini menginstal phone_numberjenis yang memiliki operator perbandingan dan fungsi. Ini menyimpan nomor dalam bentuk kanonik internasional. Ini adalah kompromi terbaik menurut saya.

parse_phone_number('textnumber', 'CountryCode');

Karena kita dapat mengetahui kapan nomor telepon sama dan kita memberikan bentuk normal internal, kita dapat melakukan ini ..

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

(mengembalikan true). Ini juga berarti DISTINCTbekerja sehingga kami dapat melakukan ini untuk mendapatkan efek yang Anda inginkan di atas.

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

Itu menempatkan ..

 parse_phone_number 
--------------------
 +61 3 7010 1234
(1 row)
Evan Carroll
sumber
8
Sayangnya, paket tersebut tampaknya berada dalam kondisi alfa selama lebih dari 1 tahun ... Perawatan yang tinggi disarankan jika Anda mencoba menggunakannya dalam produksi.
joanolo
2
@ Joanolo Anda benar, tetapi sepertinya kontributor baru, Evan Carroll, baru saja membuat komitmen hari ini ... Seseorang akan mempertimbangkan semua promosi diri ini dari pihak Evan, tetapi saya juga mengangkat jawaban-diri ini karena dia aktif berkontribusi pada ekstensi ...
Dario
3
Saya hanya "berkontribusi" pada dokumentasi. Dan, saya melakukannya sebelum saya memposting ini dengan cara yang sama yang selalu saya lakukan untuk meningkatkan dokumentasi. Saya bukan "kontributor", dalam arti apa pun yang berguna. Saya tidak punya sedikit komit. Saya tidak menulis kode C ++. Saya hanya bersemangat tentang memiliki libphonenumber yang mengikat di PgSQL dan yang lainnya mengetahui tentang mereka dan bagaimana menggunakannya.
Evan Carroll
5
Berkontribusi pada dokumentasi berkontribusi. ;) Dan saya akan menggunakan libphonenumber dalam proyek (aman, tidak kritis) saya karena pos ini. Terima kasih.
Dario
4
Untuk apa nilainya, kami menggunakan libphonenumber untuk menormalkan angka sebelum masuk ke database - dengan cara itu kita tidak perlu bergantung pada (pada saat penulisan) plugin postgres berkualitas alfa yang tidak dapat digunakan dalam RDS dan penyebaran postgres berbasis cloud lainnya.
John Hamelink