2012-08-13 34 views
16

Tôi có một cơ sở dữ liệu SQLite với ứng dụng Android của mình. Tôi đã nhận thấy tôi vô tình xác định một bảng bằng cách sử dụng một kiểu dữ liệu "String" thay vì kiểu dữ liệu "Text". Đây là mã có chuỗi:Sự khác biệt giữa kiểu dữ liệu "Văn bản" và "Chuỗi" trong SQLite

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName string not null, UpdateDate string not null);"; 

Công trình này hoạt động. Nó chưa bao giờ bị lỗi và tôi có thể lưu trữ và truy xuất dữ liệu. Tuy nhiên tôi không thể tìm thấy bất kỳ tham chiếu đến một kiểu dữ liệu "String" trong SQLite trong tài liệu hoặc trên internet. Thông thường, tất cả các loại chuỗi dữ liệu được định nghĩa với "văn bản" như vậy:

private final String LISTDATES_CREATE = "create table if not exists ListDates (_id integer primary key autoincrement, ListName text not null, UpdateDate text not null);"; 

Vì vậy, câu hỏi của tôi là, sự khác biệt giữa một lĩnh vực được xác định với một "chuỗi" datatype so với một "văn bản" datatype là gì? Có sự khác biệt nào không? Nếu vậy, hậu quả của việc sử dụng cái này hay cái kia là gì?

Trả lời

26

Điều tinh tế cần lưu ý ở đây là SQLite không thực thi kiểu dữ liệu của các giá trị bạn đưa vào cột. Điều đó có nghĩa là bạn có thể đặt văn bản vào một trường số, v.v.

Để hiểu sự khác biệt giữa hai câu lệnh SQL của bạn, hãy xem phần 2.1 Determination Of Column Affinity, ánh xạ các kiểu cột bạn cung cấp cho các lớp lưu trữ mà SQLite sử dụng.

Trong trường hợp này, loại string được ánh xạ tới storage class NUMERIC qua quy tắc 5. Tuyên bố sân khi text trong mã sẽ nói với các DBMS để sử dụng lớp TEXT lưu trữ. Một lần nữa, kể từ khi SQLite không thực thi các loại cột, mã của bạn có thể sẽ chạy tốt khi lưu trữ Strings dưới dạng cột NUMERIC, như bạn lưu ý.

Như một ví dụ khác, bạn có thể xác định một cột với kiểu INTERESTING STUFF, và đó sẽ được ánh xạ tới các lớp INTEGER lưu trữ, thông qua quy tắc 1.

Nhìn chung, nó có thể là một ý tưởng tốt để chỉ cần sử dụng text cho bạn định nghĩa bảng.

+2

Cảm ơn bạn đã phản hồi. Một khi tôi đã tìm thấy sai lầm, tôi đã thực hiện thay đổi nhưng tôi không may có mã sản xuất với sai lầm này. Vì nó dường như không phải là một vấn đề lớn, tôi chỉ để cho chúng tự nhiên. Đây thực sự là một thông tin tuyệt vời. Cảm ơn bạn! –

4

Đây là câu hỏi cũ nhưng tôi muốn nêu bật sự khác biệt cụ thể giữa loại cột STRING và TEXT. Nếu một chuỗi trông giống như một giá trị số, STRING sẽ chuyển đổi nó thành một giá trị số, trong khi TEXT sẽ không thực hiện bất kỳ chuyển đổi nào.

ví dụ:

create table t1(myint INTEGER, mystring STRING, mytext TEXT); 
insert into t1 values ('0110', '0220', '0330'); 
insert into t1 values ('-0110', '-0220', '-0330'); 
insert into t1 values ('+0110', '+0220', '+0330'); 
insert into t1 values ('x0110', 'x0220', 'x0330'); 
insert into t1 values ('011.0', '022.0', '033.0'); 
select * from t1 

hàng sẽ đầu ra với các giá trị:

myint mystring mytext 
    110  220 0330 
    -110  -220 -0330 
    110  220 +0330 
x0110 x0220 x0330 
    11  22 033.0 

Điều này có nghĩa số không hàng đầu, số không trailing điểm thập phân, và dấu cộng trên các giá trị "số" sẽ bị tước. Điều này sẽ gây ra vấn đề nếu bạn có ý định làm một chuỗi trận đấu bằng cách sử dụng các giá trị đọc ra khỏi bảng.

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