Yanıtlar:
Fark, sembolün sorgu dilinde ilgili sütun türüne nasıl dönüştürüleceğine dayanır.
MySQL ile: string VARCHAR (255) ile eşlenir - http://guides.rubyonrails.org/migrations.html
:string | VARCHAR | :limit => 1 to 255 (default = 255)
:text | TINYTEXT, TEXT, MEDIUMTEXT, or LONGTEXT2 | :limit => 1 to 4294967296 (default = 65536)
Referans:
Her biri ne zaman kullanılmalıdır?
Genel bir kural olarak, :string
kısa metin girişi (kullanıcı adı, e-posta, şifre, başlıklar vb.) İçin kullanın ve :text
açıklamalar, yorum içeriği vb. Gibi daha uzun süre beklenen girdiler için kullanın .
true
MySQL'de bir varchar'a (ergo, string
tip alanı) kaydetmek, değeri seri hale getirir 1
(ki bu tamamen adil). Ancak, text
tip altında , "true" değerinin saklanması, bu değeri tekil bir karakter olarak serileştirir t
. Bunu ve değerin doğru olduğu gelecekteki tüm satırları şimdi fark etmeden bir sütun taşıdım t
. Herkes bu davranış hakkında herhangi bir görüş var mı?
Postgres kullanıyorsanız, metin için performans cezası olmadığı için boyut sınırlaması olmadığı sürece boyut kısıtlamanız olmadığı sürece mümkün olan her yerde metin kullanın
Bu üç tür arasında, boş dolgulu türü kullanırken artan depolama alanı ve uzunluk kısıtlı bir sütuna depolarken uzunluğu kontrol etmek için birkaç ekstra CPU döngüsü dışında hiçbir performans farkı yoktur. Karakter (n) diğer bazı veritabanı sistemlerinde performans avantajlarına sahip olsa da, PostgreSQL'de böyle bir avantaj yoktur; aslında karakter (n) ek depolama maliyetleri nedeniyle genellikle üçün en yavaş olanıdır. Çoğu durumda metin veya karakter değiştirme kullanılmalıdır.
text
üzerinde (n)
veri türlerini ikna, ancak kullanımı için argüman text
üzerinde varchar
değildir. Aynı olduklarını söyler, ancak tercih edilebilir text
çünkü varchar
karıştırılabilir varchar(n)
ve yazılması text
daha az karakterdir. Ancak text
bunun yerine kullanarak varchar
, saklanan verilerin uzun olmaması gerektiği bağlamını kaybedersiniz. Örneğin, bir kullanıcı adının saklanması text
benim için yanıltıcı görünüyor.
Dize, veritabanınızda "Varchar", metin ise "metin" anlamına gelir. Bir varchar çok daha az öğe içerebilir, bir metin (neredeyse) herhangi bir uzunlukta olabilir.
İyi referanslarla derinlemesine analiz için http://www.pythian.com/news/7129/text-vs-varchar/ adresini ziyaret edin.
Düzenleme: Bazı veritabanı motorları varchar
tek seferde yükleyebilirsiniz , ancak tablonun dışında metin (ve blob) depolayabilirsiniz. Bir SELECT name, amount FROM products
kullanırken, çok daha yavaş olabilir text
için name
kullandığınızda daha varchar
. Ve Rails, varsayılan olarak SELECT * FROM...
metin sütunları ile kayıtları yükler yüklenir. Bu muhtemelen sizin veya uygulamanızda gerçek bir sorun olmayacaktır (Erken optimizasyon ...). Ancak metnin her zaman "özgür" olmadığını bilmek iyi bir şeydir.
Boyut sabit ve küçükse dize ve değişken ve büyükse metin. Bu biraz önemlidir çünkü metin dizelerden çok daha büyüktür. Çok daha fazla kilobayt içerir.
Yani küçük alanlar için her zaman string (varchar) kullanın. Alanlar gibi. ad, giriş, e-posta, konu (bir makalenin veya yayının) ve metin örnekleri: bir yayının veya makalenin içeriği / gövdesi. paragraf alanları vb.
Dize boyutu 1 ila 255 (varsayılan = 255)
Metin boyutu 1 - 4294967296 (varsayılan = 65536) 2
Adlar, adres, telefon, şirket gibi daha kısa alanlar için dize kullanın
Daha büyük içerik, yorumlar, içerik, paragraflar için Metin kullanın.
Genel kuralım, birden fazla satır olan bir şeyse, genellikle metin için gidiyorum, eğer 2-6 kelimelik kısa bir kelime ise, dize için gidiyorum.
Bir dize için resmi kural 255'tir. Dizeniz 255 karakterden fazlaysa metin için gidin.
Eğer kahini kullanıyorsanız ... STRING
olarak oluşturulacak VARCHAR(255)
sütunda ve TEXT
bir şekilde, 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 }
}
Kabul edilen cevap harika, düzgün bir şekilde dize vs metin arasındaki farkı açıklar (çoğunlukla veritabanındaki sınır boyutu, ancak birkaç başka gotchas var), ancak bu cevap olarak beni ele geçiren küçük bir sorunu belirtmek istedim tamamen benim için yapmadı.
Maksimum boyut : limit => 1 ila 4294967296 tam olarak belirtildiği gibi çalışmadı, bu maksimum boyuttan -1'e gitmem gerekiyordu. Büyük JSON lekelerini saklıyorum ve bazen çılgınca büyük olabilirler.
İşte MySQL'in şikayet etmediği değerle daha büyük bir değerle geçişim.
Not 5 limit sonunda yerine 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
Öznitelik f.text_field
formda eşleşiyorsa string kullanın , eşleşiyorsa metinf.text_area
kullanın .
:text
. Bkz. Depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text