2011-07-29 22 views
18

Tôi cần MySQL để lưu trữ số trong trường số nguyên và duy trì số 0 đứng đầu. Tôi không thể sử dụng tùy chọn zerofill vì trường hiện tại của tôi là Bigint (16) và các số có thể khác nhau về số lượng các số 0 đứng đầu. IE: 0001 - 0005, sau đó 008 - 010 có thể cần được lưu trữ. Tôi không quan tâm về tính duy nhất của các con số (chúng không được sử dụng như ID hoặc bất kỳ thứ gì) nhưng tôi vẫn cần chúng được lưu trữ tốt nhất là INTS.Lưu trữ số không đầu tiên của số nguyên trong cơ sở dữ liệu MySQL như INTEGER

Vấn đề sử dụng CHAR/VARCHAR và sau đó typecasting các giá trị là số nguyên trong PHP có nghĩa là sắp xếp kết quả thông qua các truy vấn dẫn đến chữ và số phân loại, IE: Sắp xếp số ASC sẽ tạo ra

001 
002 
003 
1 
100 
101 
102 
2 

Rõ ràng không theo số thứ tự , nhưng theo thứ tự chữ và số, điều này không được mong muốn.

Hy vọng đối với một số cách giải quyết thông minh :)

+0

số nguyên không * đã * zero hàng đầu. Chỉ có các biểu diễn chuỗi của chúng có thể. Vì vậy, nếu bạn "cần" zeroes hàng đầu, bạn sẽ phải lưu trữ một chuỗi đại diện. Tại sao bạn không thể thực hiện loại định dạng này ở thời gian hiển thị, thay vì đặt nó trong cơ sở dữ liệu? –

+0

1 và 001 và các giá trị khác nhau. Nhưng như int họ là như nhau: làm thế nào nên được sắp xếp và so sánh? như int hoặc như varchar? – gbn

Trả lời

6

Bạn vẫn có thể sắp xếp các chuỗi (CHAR/VARCHAR) cột như số nguyên sử dụng CAST

ORDER BY CAST(`col_name` AS SIGNED) DESC 

Vì vậy, bạn có thể lưu trữ chúng trong các lĩnh vực loại CHAR/VARCHAR .

+2

Cũng có thể làm 'ORDER BY col_name + 0 DESC' để sắp xếp một varchar như số nguyên –

6

Bạn không thể lưu trữ số nguyên với số 0 đứng đầu. Một cách là giữ nó trong varchar cũng như các cột int. Trong trường hợp này, bạn cần hai cột, một giá trị và intValue khác và trong khi sắp xếp, bạn có thể sử dụng intValue để sắp xếp. Điều này rất dễ thực hiện.

Select Value from Table order by intValue; 

Tùy chọn khác có thể sử dụng hai cột, một valu và othe NumOfZero và sử dụng chúng cho kết quả mong muốn. Điều này phức tạp, nhưng có thể là ánh sáng trên DB.

+0

Lưu ý: nếu bạn biết rằng cột sẽ luôn có cùng độ dài, sử dụng CHAR, không phải VARCHAR. –

19

Giữ các số được lưu dưới dạng số nguyên.

Sau đó sử dụng chức năng LPAD() để hiển thị các số (trái) đệm bằng số không:

SELECT LPAD(14, 7, '0') AS padded; 

| padded | 
----------- 
| 0000014 | 

Nếu số ký tự zerofill có thể thay đổi, thêm cột khác trong bảng với điều đó (zerofill) chiều dài.

4

Thay đổi cấu trúc của trường và tạo Thuộc tính UNSIGNED_ZEROFILL để giữ các số 0.

Nhưng bạn nên cẩn thận với Chiều dài của lĩnh vực này, bởi vì nó sẽ trả lại tất cả số còn lại để số không nên đặt theo chiều dài của lĩnh vực của bạn

Các vấn đề liên quan