2011-08-22 16 views
9

Có vẻ như BIGINT là số nguyên lớn nhất có sẵn trên MySql, phải không?Việc cần làm khi bạn cần số nguyên lớn hơn 20 chữ số trên mysql?

Việc cần làm khi bạn cần lưu trữ BIGINT (80) chẳng hạn?

Tại sao trong một số trường hợp, như ở một nơi nào đó trong tài liệu API của Twitter, họ khuyên chúng tôi lưu trữ các số nguyên lớn này là varchar?

Lý do thực sự đằng sau lựa chọn sử dụng loại này hay cách khác là trường hợp này?

+0

BIGINT bị giới hạn bởi định nghĩa là 8 byte. – mozillanerd

Trả lời

18

Số nguyên lớn không thực sự giới hạn ở 20 chữ số, chúng được giới hạn ở các số có thể được biểu thị bằng 64 bit (ví dụ: số 99,999,999,999,999,999,999 không phải là số nguyên hợp lệ mặc dù dài 20 chữ số).

Lý do bạn có giới hạn này là số nguyên định dạng gốc có thể được thao tác tương đối nhanh bởi phần cứng cơ bản trong khi phiên bản văn bản của một số (có xu hướng) cần được xử lý một chữ số tại một thời điểm.

Nếu bạn muốn số lớn hơn số nguyên không dấu 64 bit lớn nhất 18,446,744,073,709,551,615 thì bạn sẽ cần lưu trữ số đó là varchar (hoặc trường văn bản khác) và hy vọng bạn không cần thực hiện nhiều thao tác toán học . Ngoài ra, bạn có thể xem các số dấu phẩy động có phạm vi rộng hơn nhưng độ chính xác thấp hơn hoặc số thập phân có thể cung cấp cho bạn 65 chữ số cho giá trị tích phân, với decimal(65,0) làm loại cột.

+0

Điều nào là tốt nhất cho các câu lệnh 'ORDER' và' WHERE'? (Với các chỉ số được giải quyết hợp lý). Ví dụ 'SELECT column1 FROM tableA WHERE mybigint> N ORDER BY date LIMIT 100000'. Trong trường hợp này, được sử dụng để phân trang kết quả. –

+0

@Keyne, giá trị thập phân sẽ hoạt động tốt cho điều đó nhưng có thể sẽ chậm hơn so với các loại tích phân nguyên. Hệ thống phân cấp tốc độ có thể là các tích phân, số thập phân, biến số không hợp lý và các biến thể không hợp lý (nhanh nhất đến chậm nhất) nhưng bạn không nên tin lời khuyên của một số yobbo trên mạng, thậm chí tôi :-) Đo lường, don ' t đoán. Sau đó sử dụng nhanh nhất cung cấp phạm vi bạn cần. Cụ thể, nếu bạn cần 80 chữ số, hãy sử dụng varchars hợp lý (để 42 được lưu trữ dưới dạng '0000000000 ... 000000042' chẳng hạn). ... – paxdiablo

+0

... Trong 25 chữ số, có thể là số thập phân (25,0). Đối với 19 chữ số, bigint. Và cứ thế. Lược đồ của bạn không bị khóa mãi mãi.Nếu, tại một số điểm, bạn cần phải di chuyển từ 19 đến 25 chữ số, sau đó bạn thực hiện các thay đổi tại thời điểm đó từ bigint sang thập phân, nếu không nguyên tắc YAGNI có thể áp dụng. – paxdiablo

3

Bạn có thể chỉ định numeric(65,0), nhưng nếu bạn cần lớn hơn, bạn sẽ cần một varchar.

Lý do chọn cái khác là cách sử dụng, hiệu quả và không gian. Sử dụng một int là hiệu quả hơn một bigint hoặc, tôi tin rằng, số Nếu bạn cần phải làm toán trên đó.

2

Bạn có thể lưu trữ các số nguyên lớn đó là an arbitrary binary string nếu bạn muốn hiệu quả lưu trữ tối đa.

Nhưng tôi không chắc liệu nó có xứng đáng không vì bạn cũng sẽ phải xử lý hơn 64 bit số nguyên trong ứng dụng của mình, cũng là not the thing you want to do mà không có lý do chính đáng.

Giữ mọi thứ đơn giản hơn và sử dụng varchar.

-4

BIGINT bị giới hạn bởi định nghĩa thành 8 chữ số. Số lượng chữ số tối đa trong loại DECIMAL là 64. Bạn phải sử dụng VARCHAR để lưu trữ các giá trị có độ chính xác lớn hơn và lưu ý rằng không có toán học trực tiếp nào về các giá trị đó.

+4

byte, không phải chữ số. – yan