BigInt hoặc Varchar cho một số lượng lớn tôi sẽ không bao giờ sắp xếp / tính toán trên


7

Tôi cần lưu trữ ID Facebook của người dùng trong một cột trong DB của mình.

ID luôn chỉ bao gồm các chữ số và có thể lớn bằng một con số vượt quá 500 triệu. Xem xét rằng tôi sẽ không bao giờ cần phải thực hiện bất kỳ số học, sắp xếp hoặc sử dụng các toán tử quan hệ nào trên các giá trị, điều gì sẽ là lựa chọn tốt hơn: BigInthay varchar?

Giá trị sẽ luôn là duy nhất và không bao giờ không tồn tại ( null)

Hoạt động duy nhất tôi làm là kiểm tra sự tồn tại của ID trong cơ sở dữ liệu, tức là =toán tử.

Câu trả lời:


4

varchar thêm chi phí:

  • độ dài của chuỗi cần được lưu trữ (thêm 2 byte IIRC trong MySQL) cho mỗi trường trong chỉ mục
  • yêu cầu xử lý nhiều hơn để đối chiếu

Nói vậy, API Facebook mô tả loại này là gì? Tất nhiên là sử dụng "bản địa"


Phản hồi được mã hóa JSON từ API Facebook không đề xuất bất kỳ loại nào. Dưới đây là một ví dụ: graph.facebook.com/ayushsazedi
xbonez

2
Tôi thấy trong http://developers.facebook.com/docs/reference/api/user/ : "Các trường. Đối tượng người dùng có các trường sau:"Name: id | Description: The user's Facebook ID | Permissions: No access_token required | Returns: **string**
ypercubeᵀᴹ

1

Theo Tài liệu MySQL trên BIGINT

BIGINT [(M)] [UNSIGNED] [ZEROFILL] Một số nguyên lớn. Phạm vi đã ký là -9223372036854775808 đến 9223372036854775807. Phạm vi không dấu là 0 đến 18446744073709551615.

SERIAL là một bí danh cho BIGINT KHÔNG ĐƯỢC ĐĂNG KÝ KHÔNG NULL AUTO_INCREMENT UNIITE.

Một số điều bạn cần lưu ý đối với các cột BIGINT:

■ Tất cả số học được thực hiện bằng các giá trị BIGINT hoặc NHÂN ĐÔI đã ký, vì vậy bạn không nên sử dụng các số nguyên lớn không dấu lớn hơn 9223372036854775807 (63 bit) trừ các hàm bit! Nếu bạn làm điều đó, một số chữ số cuối cùng trong kết quả có thể sai do làm tròn các lỗi khi chuyển đổi giá trị BIGINT thành NHÂN ĐÔI.

MySQL có thể xử lý BIGINT trong các trường hợp sau:

Khi sử dụng số nguyên để lưu trữ các giá trị không dấu lớn trong cột BIGINT.

Trong MIN (col_name) hoặc MAX (col_name), trong đó col_name đề cập đến cột BIGINT.

Khi sử dụng các toán tử (+, -, *, v.v.) trong đó cả hai toán hạng đều là số nguyên.

■ Bạn luôn có thể lưu trữ một giá trị số nguyên chính xác trong cột BIGINT bằng cách lưu trữ nó bằng chuỗi. Trong trường hợp này, MySQL thực hiện chuyển đổi chuỗi thành số không liên quan đến biểu diễn chính xác kép trung gian.

■ Toán tử -, + và * sử dụng số học BIGINT khi cả hai toán hạng đều là giá trị nguyên. Điều này có nghĩa là nếu bạn nhân hai số nguyên lớn (hoặc kết quả từ các hàm trả về số nguyên), bạn có thể nhận được kết quả không mong muốn khi kết quả lớn hơn 9223372036854775807.

Như bạn đã nói, miễn là bạn không thực hiện bất kỳ số học, sắp xếp hoặc sử dụng các toán tử quan hệ nào trên các giá trị, tôi sẽ đi với BIGINT.

Tài liệu chỉ đề cập đến việc lưu trữ số dưới dạng một chuỗi để bỏ qua các bước trung gian được thực hiện thông qua biểu diễn chính xác kép.

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.