Câu trả lời:
Sự khác biệt phụ thuộc vào cách biểu tượng được chuyển đổi thành loại cột tương ứng trong ngôn ngữ truy vấn.
với MySQL: chuỗi được ánh xạ tới VARCHAR (255) - http://guides.rubyonrails.org/migations.html
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
Tài liệu tham khảo:
Khi nào nên sử dụng mỗi?
Theo nguyên tắc chung, sử dụng :string
cho nhập văn bản ngắn (tên người dùng, email, mật khẩu, tiêu đề, v.v.) và sử dụng :text
cho đầu vào dự kiến dài hơn như mô tả, nội dung nhận xét, v.v.
true
vào một varchar (ergo, string
loại trường) trong MySQL tuần tự hóa giá trị thành 1
(điều này hoàn toàn công bằng). Tuy nhiên, dưới text
loại, lưu trữ giá trị "true" kết thúc tuần tự hóa nó dưới dạng char số ít t
. Tôi đã di chuyển một cột mà không nhận ra điều này và tất cả các hàng trong tương lai nơi giá trị là đúng t
. Có ai có bất kỳ hiểu biết về hành vi này?
Nếu bạn đang sử dụng postgres, hãy sử dụng văn bản bất cứ nơi nào bạn có thể, trừ khi bạn có một ràng buộc về kích thước vì không có hình phạt về hiệu suất đối với văn bản so với varchar
Không có sự khác biệt về hiệu năng giữa ba loại này, ngoài không gian lưu trữ tăng lên khi sử dụng loại đệm trống và một vài chu kỳ CPU bổ sung để kiểm tra độ dài khi lưu trữ vào cột bị giới hạn độ dài. Mặc dù ký tự (n) có lợi thế về hiệu năng trong một số hệ thống cơ sở dữ liệu khác, nhưng PostgreQuery không có lợi thế như vậy; trong thực tế, ký tự (n) thường là chậm nhất trong ba vì chi phí lưu trữ bổ sung của nó. Trong hầu hết các tình huống, văn bản hoặc ký tự thay đổi nên được sử dụng thay thế
text
trên (n)
các loại dữ liệu rất thuyết phục, nhưng đối số cho việc sử dụng text
hơn varchar
thì không. Anh ta nói họ giống nhau nhưng thích text
bởi vì varchar
có thể bị nhầm lẫn varchar(n)
và vì text
ít ký tự hơn để gõ. Nhưng sử dụng text
thay vì varchar
, bạn sẽ mất bối cảnh dữ liệu được lưu trữ không nên dài. Ví dụ: lưu trữ tên người dùng có text
vẻ gây hiểu lầm cho tôi.
Chuỗi dịch thành "Varchar" trong cơ sở dữ liệu của bạn, trong khi văn bản dịch thành "văn bản". Một varchar có thể chứa các mục ít hơn rất nhiều, một văn bản có thể có (gần như) bất kỳ độ dài nào.
Để có phân tích chuyên sâu với các tài liệu tham khảo tốt, hãy kiểm tra http://www.pythian.com/news/7129/text-vs-varchar/
Chỉnh sửa: Một số công cụ cơ sở dữ liệu có thể tải varchar
trong một lần, nhưng lưu trữ văn bản (và blob) bên ngoài bảng. Một SELECT name, amount FROM products
thể, chậm hơn rất nhiều khi sử dụng text
cho name
hơn khi bạn sử dụng varchar
. Và vì Rails, theo mặc định tải các bản ghi với SELECT * FROM...
các cột văn bản của bạn sẽ được tải. Điều này có lẽ sẽ không bao giờ là một vấn đề thực sự trong ứng dụng của bạn hoặc của tôi (Tối ưu hóa sớm là ...). Nhưng biết rằng văn bản không phải lúc nào cũng "miễn phí" là điều tốt để biết.
Chuỗi nếu kích thước là cố định và nhỏ và văn bản nếu nó là biến và lớn. Đây là loại quan trọng vì văn bản lớn hơn chuỗi. Nó chứa nhiều kilobyte hơn.
Vì vậy, đối với các trường nhỏ luôn luôn sử dụng chuỗi (varchar). Lĩnh vực như thế nào. First_name, đăng nhập, email, chủ đề (của một bài viết hoặc bài đăng) và ví dụ về các văn bản: nội dung / nội dung của một bài viết hoặc bài viết. các trường cho đoạn văn v.v.
Chuỗi kích thước 1 đến 255 (mặc định = 255)
Kích thước văn bản 1 đến 4294967296 (mặc định = 65536) 2
Sử dụng chuỗi cho trường ngắn hơn, như tên, địa chỉ, điện thoại, công ty
Sử dụng Văn bản cho nội dung lớn hơn, bình luận, nội dung, đoạn văn.
Quy tắc chung của tôi, nếu đó là một cái gì đó nhiều hơn một dòng, tôi thường đi tìm văn bản, nếu đó là 2-6 từ ngắn, tôi đi theo chuỗi.
Quy tắc chính thức là 255 cho một chuỗi. Vì vậy, nếu chuỗi của bạn có nhiều hơn 255 ký tự, hãy tìm văn bản.
Nếu bạn đang sử dụng oracle ... STRING
sẽ được tạo dưới dạng VARCHAR(255)
cột và TEXT
, như một CLOB
.
NATIVE_DATABASE_TYPES = {
primary_key: "NUMBER(38) NOT NULL PRIMARY KEY",
string: { name: "VARCHAR2", limit: 255 },
text: { name: "CLOB" },
ntext: { name: "NCLOB" },
integer: { name: "NUMBER", limit: 38 },
float: { name: "BINARY_FLOAT" },
decimal: { name: "DECIMAL" },
datetime: { name: "TIMESTAMP" },
timestamp: { name: "TIMESTAMP" },
timestamptz: { name: "TIMESTAMP WITH TIME ZONE" },
timestampltz: { name: "TIMESTAMP WITH LOCAL TIME ZONE" },
time: { name: "TIMESTAMP" },
date: { name: "DATE" },
binary: { name: "BLOB" },
boolean: { name: "NUMBER", limit: 1 },
raw: { name: "RAW", limit: 2000 },
bigint: { name: "NUMBER", limit: 19 }
}
Câu trả lời được chấp nhận là tuyệt vời, nó giải thích chính xác sự khác biệt giữa chuỗi so với văn bản (chủ yếu là kích thước giới hạn trong cơ sở dữ liệu, nhưng có một vài vấn đề khác), nhưng tôi muốn chỉ ra một vấn đề nhỏ giúp tôi vượt qua nó như câu trả lời đó đã không hoàn toàn làm điều đó cho tôi.
Kích thước tối đa : giới hạn => 1 đến 4294967296 không hoạt động chính xác như đặt, tôi cần đi -1 từ kích thước tối đa đó. Tôi đang lưu trữ các đốm JSON lớn và đôi khi chúng có thể rất lớn.
Đây là sự di chuyển của tôi với giá trị lớn hơn thay cho giá trị mà MySQL không phàn nàn.
Lưu ý 5 ở cuối giới hạn thay vì 6
class ChangeUserSyncRecordDetailsToText < ActiveRecord::Migration[5.1]
def up
change_column :user_sync_records, :details, :text, :limit => 4294967295
end
def down
change_column :user_sync_records, :details, :string, :limit => 1000
end
end
:text
. Xem depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text