Kiểu dữ liệu cho số điện thoại: VARCHAR, INT hoặc BIGINT?


12

Vì vậy, đây sẽ là câu hỏi giả trong năm nhưng tôi cần hỏi vì đây không phải là lần đầu tiên tôi vượt qua điều này. Hãy xem định nghĩa bảng sau:

nhập mô tả hình ảnh ở đây

Hãy nhìn vào cột from_numberlà một VARCHAR(45)quyền ngay bây giờ nhưng nó sẽ giữ một số điện thoại. Vì tôi không biết có bao nhiêu số điện thoại có thể có trên toàn thế giới nên tôi đang cố gắng bao phủ gần như tất cả chúng. Tôi muốn giữ tính toàn vẹn của cơ sở dữ liệu càng nhiều càng tốt để tôi nghĩ rằng đó VARCHARkhông phải là một loại thích hợp để giữ loại thông tin này - có thể tôi sai, bạn nói với tôi - vì vậy tôi đang suy nghĩ thay đổi INThoặc thậm chí BIGINT.

Khi tôi xác định một cột trong Workbench, tôi nên chỉ định số giữa các dấu ngoặc đơn ()không phải trong tất cả các trường hợp nhưng trong những trường hợp tôi đã đề cập trước đây tôi phải làm. Vì vậy, nếu tôi làm điều này: BIGINT()tôi đã gặp lỗi này:

nhập mô tả hình ảnh ở đây

Hướng dẫn tôi đọc một chút về loại MySQL này ở đây . Về cơ bản thông tin là thế này:

Một số nguyên lớn. ... Phạm vi không dấu là 0 đến 18446744073709551615.

Điều này khiến tôi hỏi: giá trị nào tôi nên đặt cho dấu ngoặc đơn khi tôi xác định BIGINT()loại. (Tôi đang sử dụng BIGINT vì tôi không biết liệu INT có thể chứa nhiều số điện thoại như vậy không - có lẽ tôi cũng sai). Đó là cách đúng để tạo | thiết kế một cột trong cơ sở dữ liệu MariaDB / MySQL?

Dù sao tôi cũng muốn biết ý kiến, kinh nghiệm của bạn và tất nhiên tôi muốn nhận được câu trả lời

Lưu ý: Tôi đang sử dụng MySQL Workbench phiên bản mới nhất để tạo sơ đồ ER. Tôi cũng đang sử dụng MariaDB 10.0.x


Câu trả lời:


13

Làm thế nào bạn có thể xử lý một số điện thoại có phần mở rộng, chẳng hạn như "+ 1-000-000-0000 ext 1234"?

Lưu ý, "+" cho biết các quy tắc quay số quốc tế nên được áp dụng; vì vậy từ Bắc Mỹ, hệ thống sẽ tự động biết "011" trước các cuộc gọi quốc tế, v.v.

Ngoài ra, còn các số điện thoại như "1-800-DBA-HELP" thì sao?

Tôi thường lưu trữ số điện thoại dưới dạng văn bản. Phải nói rằng, nó thực sự phụ thuộc vào mức độ quan trọng của cột số điện thoại của bạn. Nếu bạn đang chạy trình quay số tự động từ cột đó, thì bạn thực sự muốn đảm bảo rằng chỉ bao gồm các số và dữ liệu đại diện cho các số điện thoại được định dạng tốt.

Bạn có thể có các cột riêng cho tiện ích mở rộng và số điện thoại có văn bản, chẳng hạn như ví dụ "1-800-DBA-HELP" tôi đã cung cấp.


Vâng, họ sẽ rất quan trọng vì vậy tôi sẽ không phạm sai lầm nào trong tương lai, dựa vào đó tôi sẽ chỉ cho phép các con số, đề xuất của bạn là gì? Thật dễ dàng để thêm một cột mới chứa số tiện ích mở rộng hoặc tôi muốn làm cho mọi người nhập số 1-800-DBA-HELPtheo số đó
ReynierPM

Nó thực sự phụ thuộc vào yêu cầu của bạn. Nếu bạn cần giữ lại khả năng nhận biết của con người, tôi chắc chắn sẽ muốn giữ các số dựa trên văn bản ở đâu đó, có thể trong một trường văn bản. Nếu bạn không quan tâm đến phần văn bản, thì đừng lưu trữ chúng.
Max Vernon

1
INT chắc chắn không đủ lớn nếu bạn lưu trữ số đầy đủ với mã quốc gia. BIGINT có lẽ là đủ lớn.
Max Vernon

1
Tôi muốn ít nhất 20 chữ số.
Max Vernon

1
Với MariaDB, bạn có thể sử dụng trường được tính toán để chỉ trích xuất các chữ số cho trình quay số tự động. Có thể trong MySQL 5.7 (không chắc chắn).
Vérace

2

Trước đây nó đã được viết:

"Với MariaDB, bạn có thể sử dụng một computedtrường để chỉ trích xuất các chữ số cho trình quay số tự động. Cũng hoạt động cho MySQL 5.7."

Để trả lời câu hỏi của OP về vấn đề này ("bạn có thể giải thích một chút bạn đang nói gì với tôi không?"), Đây là một lời giải thích.

Nhiều hệ thống cơ sở dữ liệu hiện đã giới thiệu tính năng này. Đây là các trường được gọi khác nhau là " computed", " virtual" hoặc " generated" được lấy từ các giá trị trong các trường khác. Sức mạnh của tính năng này sẽ thay đổi tùy thuộc vào RDBMS của bạn. Tôi biết rằng Oracle, Firebird, MariaDB và giờ là MySQL 5.7 có chúng. Những người khác có lẽ cũng làm.

Một ví dụ đơn giản là có một cột họ và có một cột được tính toán "lưu trữ" (hãy nhớ rằng chúng có thể là ảo - tức là được tính khi đang bay hoặc chúng có thể được lưu trữ trên đĩa) họ như tất cả các thủ đô, do đó thực hiện tìm kiếm dễ dàng hơn. Bằng cách đó, bạn chỉ phải tìm kiếm trên CAPs (bằng cách sử dụng, giả sử LIKE), biết rằng dữ liệu đang được tìm kiếm trong [ computed| virtual| generated] trường là trong văn bản viết hoa.

Khái niệm về MySQL 5.7 được giải thích tại đâytại đây . Nó đã ở MariaDB lâu hơn một chút và khái niệm này cũng được giải thích ở đây . Một số cách sử dụng có thể được đề xuất ở đây , nhưng bạn thực sự chỉ bị giới hạn bởi trí tưởng tượng của bạn. Chúng có thể được xem như là một sự thay thế thuận tiện (và ít xảy ra lỗi) cho các kích hoạt.

Đối với trường hợp sử dụng cụ thể của bạn, bạn có thể lấy số có thể quay số từ trường văn bản "+" -> "00" (hoặc bất kỳ mã quay số quốc tế nào của bạn). Chỉ là một ý nghĩ.


Tuyệt vời, bạn có thể cải thiện một chút câu hỏi của mình bằng cách thêm một số truy vấn không? Tôi có nghĩa là tôi có khái niệm nhưng tôi không chắc chắn làm thế nào để tạo ra virtualhoặc generatedgiá trị. Tôi đang suy nghĩ trong sử dụng CONCAThoặc một cái gì đó khác nhưng không chắc chắn. Ngoài ra, bạn đề cập đến một tìm kiếm bằng CAPScách sử dụng LIKEbạn có thể đưa ra một ví dụ về điều này quá? Còn hiệu suất của các cột được tính khi đang bay ( virtual) vs persisted (được tạo ra) thì sao?
ReynierPM

1

Hừm. Số điện thoại được làm bằng số. Sử dụng varchar cho phép người dùng lưu trữ bất kỳ loại định dạng nào, với (hoặc không, với - hoặc. Và nó nhanh chóng tạo ra một mớ hỗn độn với dữ liệu của bạn. Định dạng số điện thoại phụ thuộc vào "quốc gia", mặt nạ phải được gắn với quốc gia. là một tiện ích mở rộng và là tùy chọn, vì vậy nó nên được lưu trữ trong "trường mở rộng". (int int). Đối với 1-800-DBA-HELP, tôi sẽ chuyển đổi nó một cách nhanh chóng và lưu trữ số thực tế. Nếu bạn thực sự cần những thứ này số điện thoại có thể đọc được của con người, lưu trữ nó trong trường varchar riêng biệt.


1

Tôi thường lưu các số điện thoại trong văn bản đơn giản . Định dạng và hiển thị để lại cho mã khách hàng.

Ở đây, nhiều hơn, làm thế nào bạn lưu trữ? những gì bạn sẽ làm với số điện thoại đó là thực sự quan trọng.

Nếu doanh nghiệp của bạn muốn thực hiện các cuộc gọi đi từ hệ thống của bạn, ứng dụng sẽ chỉ trích xuất các số. Nếu doanh nghiệp của bạn muốn thực hiện cuộc gọi quốc tế , hãy lưu mã quốc gia và mã vùng trong các cột riêng biệt.

Nếu doanh nghiệp của bạn muốn báo cáo , ứng dụng sẽ định dạng và hiển thị với phần mở rộng và số riêng biệt.

Theo hiểu biết của tôi, thiết kế mô hình dữ liệu phổ quát cho số điện thoại không phải là một ý tưởng tốt. Mỗi quốc gia có số lượng, phần mở rộng và mã vùng khác nhau ngoài mã quốc gia. Ngoài ra, tôi đã biết, một số quốc gia không có mã vùng.

Điều này có thể không trả lời câu hỏi của bạn nhưng nó sẽ giúp mở rộng sự hiểu biết của chúng tôi. Cảm ơn bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.