2010-08-02 40 views
18

Tôi đang sử dụng SQLite trong một ứng dụng Java thông qua Zentus. Trong bối cảnh này, tôi cần lưu và truy vấn các giá trị Java long trong cơ sở dữ liệu của tôi. Đến từ RDBMS khác mà tôi tạo ra bảng như sau để lưu trữ các giá trị dài:Các loại dữ liệu SQLite

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG) 

Giải pháp này tạo ra hành vi trừ nhưng sau khi đọc SQLite documentation on data types tôi hiểu rằng loại LONG của tôi có tác dụng tương tự vì sử dụng TEXT =>longValue là được lưu dưới dạng văn bản.

Sau đó, tôi quyết định đổi số này thành INTEGER (độ dài thay đổi và có thể lưu trữ tối đa 64 bit số nguyên là chiều dài của Java) để có mã sạch hơn và có thể tiết kiệm dung lượng đĩa và tăng biểu diễn vì longValues ​​của tôi được chèn và truy vấn là long.

Sau khi so sánh các buổi biểu diễn và kích thước của cơ sở dữ liệu được tạo ra tôi không thể nhìn thấy bất kỳ sự khác biệt giữa:

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue LONG) 

CREATE TABLE myTable (id INTEGER PRIMARY_KEY, longValue INTEGER) 

Bất kỳ ý kiến, kinh nghiệm hay cảm xúc về đề tài này?

Trả lời

22

Trong SQLite, các kiểu dữ liệu là giá trị trên mỗi giá trị, không phải cho mỗi cột. Vì vậy, khi bạn chèn số nguyên, chúng được lưu trữ dưới dạng số nguyên bất kể loại cột.

+4

Vì vậy, tôi tự hỏi: tại sao các loại cột tồn tại? –

+9

Cột có "ái lực"; ví dụ, một cột văn bản được chuyển qua một chuỗi số nên lưu trữ nó dưới dạng văn bản, giữ nguyên định dạng (chữ số thập phân, v.v.). Trong khi một cột số được chuyển qua một chuỗi số sẽ chuyển đổi nó thành một số trước khi lưu trữ, vì vậy "10,00" sau đó sẽ được trả về chỉ là "10". Vì cột DÀI có mối quan hệ số mặc định, việc thay đổi loại thành INTEGER không thay đổi bất kỳ thứ gì. –

+3

Câu trả lời fron SQlite trang web là: "Để tối đa hóa khả năng tương thích giữa SQLite và các công cụ cơ sở dữ liệu khác, SQLite hỗ trợ khái niệm" loại ái lực "trên các cột. Ý tưởng quan trọng ở đây là loại được khuyến nghị, không bắt buộc, bất kỳ cột nào cũng có thể lưu trữ bất kỳ loại dữ liệu nào. Nó chỉ là một số cột, được chọn, sẽ thích sử dụng một lớp lưu trữ hơn một "Nhưng cái gì" thích "có nghĩa là ?? Có bất kỳ tác động nào đến kích thước biểu diễn và cơ sở dữ liệu không? –

7

SQLite tự động chọn kích thước phù hợp. Từ http://www.sqlite.org/datatype3.html:

INTEGER. Giá trị là số nguyên đã ký, được lưu trữ trong 1, 2, 3, 4, 6 hoặc 8 byte tùy thuộc vào độ lớn của giá trị.

SQLite sử dụng các loại động và không có lược đồ.

+0

Cảm ơn câu trả lời nhanh Christian. Tôi đã đọc nó, và đó là lý do tại sao tôi nghĩ rằng kích thước cơ sở dữ liệu của tôi với INTEGER sẽ nhỏ hơn kích thước có LONG vì mã hóa một "văn bản" dài (utf8 tôi nghĩ) nên đắt hơn so với sử dụng số nguyên chiều dài thay đổi. phải không? Làm thế nào tôi có thể giải thích cùng kích thước cho 2 cơ sở dữ liệu? –

+0

Không phải là "lược đồ miễn phí" theo ý nghĩa của các hệ thống cơ sở dữ liệu NoSQL (khóa/giá trị) của khóa học. Liên kết đầu tiên tôi đưa ra và http: //www.sqlite.org/different.html giải thích việc nhập chi tiết hơn. –

7

Sau khi xem xét các buổi biểu diễn và kích thước của cơ sở dữ liệu được tạo ra tôi không thể thấy bất kỳ sự khác biệt giữa:

không phải là bất kỳ sự khác biệt. INTEGER có ái lực nguyên và LONG có ái lực số. Và, http://www.sqlite.org/datatype3.html nói:

Một cột có sử dụng INTEGER ái lực cư xử giống như một cột với ái lực NUMERIC. Sự khác biệt giữa INTEGER và NUMERIC ái lực chỉ hiển nhiên trong biểu thức CAST.

+0

Bạn có nghĩa là trong một diễn viên một số hoạt động như một loại "điểm động"? – Pacerier

2
CREATE TABLE ex2(
    a VARCHAR(10), 
    b NVARCHAR(15), 
    c TEXT, 
    d INTEGER, 
    e FLOAT, 
    f BOOLEAN, 
    g CLOB, 
    h BLOB, 
    i TIMESTAMP, 
    j NUMERIC(10,5) 
    k VARYING CHARACTER (24), 
    l NATIONAL VARYING CHARACTER(16) 
); 
Các vấn đề liên quan