Odpowiedzi:
Różnica polega na tym, jak symbol jest konwertowany na odpowiedni typ kolumny w języku zapytań.
z MySQL: łańcuch jest mapowany na VARCHAR (255) - 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)
Odniesienie:
Kiedy należy stosować każdy z nich?
Zasadniczo należy używać :string
do wprowadzania krótkich tekstów (nazwa użytkownika, adres e-mail, hasło, tytuły itp.) I używać :text
do dłuższych oczekiwanych danych wejściowych, takich jak opisy, treść komentarzy itp.
true
w varchar (pole ergo, string
type) w MySQL serializuje wartość do 1
(co jest całkowicie uczciwe). Jednak w text
typie zapisanie wartości „true” kończy się szeregowaniem jej jako pojedynczego znaku t
. Migrowałem kolumnę, nie zdając sobie z tego sprawy, i wszystkie przyszłe wiersze, w których wartość jest prawdziwa, są teraz t
. Czy ktoś ma wgląd w to zachowanie?
Jeśli korzystasz z Postgres, używaj tekstu gdziekolwiek możesz, chyba że masz ograniczenie rozmiaru, ponieważ nie ma ograniczenia wydajności dla tekstu w porównaniu z varchar
Nie ma żadnej różnicy w wydajności między tymi trzema typami, oprócz zwiększonej przestrzeni dyskowej przy użyciu pustego wypełnienia i kilku dodatkowych cykli procesora, aby sprawdzić długość podczas przechowywania w kolumnie o ograniczonej długości. Chociaż znak (n) ma przewagę wydajności w niektórych innych systemach baz danych, nie ma takiej przewagi w PostgreSQL; w rzeczywistości znak (n) jest zwykle najwolniejszy z trzech ze względu na dodatkowe koszty przechowywania. W większości sytuacji zamiast tego należy używać tekstu lub różnych znaków
text
przez (n)
typy danych są przekonujące, ale argument za korzystanie text
przez varchar
nie. Mówi, że są takie same, ale woli, text
ponieważ varchar
można go pomylić varchar(n)
i ponieważ text
jest mniej znaków do pisania. Ale text
zamiast tego varchar
tracisz kontekst, że przechowywane dane nie powinny być długie. Na przykład przechowywanie nazwy użytkownika text
wydaje mi się mylące.
Łańcuch przekłada się na „Varchar” w bazie danych, podczas gdy tekst tłumaczy się na „tekst”. Varchar może zawierać znacznie mniej elementów, tekst może mieć (prawie) dowolną długość.
Aby uzyskać dogłębną analizę z dobrymi referencjami, sprawdź http://www.pythian.com/news/7129/text-vs-varchar/
Edycja: Niektóre silniki baz danych mogą być ładowane varchar
za jednym razem, ale przechowują tekst (i obiekt blob) poza tabelą. SELECT name, amount FROM products
Mogłaby być o wiele wolniej podczas korzystania text
z name
niż podczas używania varchar
. A ponieważ Railsy domyślnie SELECT * FROM...
ładują rekordy z kolumnami tekstowymi, zostaną załadowane. Prawdopodobnie nigdy nie będzie to prawdziwym problemem w Twojej lub mojej aplikacji (przedwczesna optymalizacja to ...). Ale dobrze wiedzieć, że tekst nie zawsze jest „darmowy”.
Ciąg, jeśli rozmiar jest stały i mały, a tekst, jeśli jest zmienny i duży. Jest to trochę ważne, ponieważ tekst jest znacznie większy niż napisy. Zawiera znacznie więcej kilobajtów.
Dlatego w przypadku małych pól zawsze używaj łańcucha (varchar). Pola takie jak. imię, login, adres e-mail, temat (artykułu lub postu) i przykład tekstów: treść / treść postu lub artykułu. pola na akapity itp
Rozmiar łańcucha od 1 do 255 (domyślnie = 255)
Rozmiar tekstu od 1 do 4294967296 (domyślnie = 65536) 2
Użyj ciągu dla krótszych pól, takich jak nazwiska, adres, telefon, firma
Użyj Tekstu dla większych treści, komentarzy, treści, akapitów.
Zasadą ogólną jest to, że jeśli jest to coś więcej niż jedna linia, zazwyczaj wybieram tekst, jeśli jest to 2-6 słów, wybieram ciąg znaków.
Oficjalna reguła to 255 dla ciągu. Jeśli więc ciąg ma więcej niż 255 znaków, przejdź do tekstu.
Jeśli używasz oracle ... STRING
zostanie utworzony jako VARCHAR(255)
kolumna i TEXT
jako 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 }
}
Przyjęta odpowiedź jest niesamowita, właściwie wyjaśnia różnicę między ciągiem a tekstem (głównie w limicie rozmiaru bazy danych, ale istnieje kilka innych błędów), ale chciałem wskazać na mały problem, który pomógł mi przejść przez tę odpowiedź nie zrobiłem tego całkowicie dla mnie.
Maksymalny rozmiar : limit => 1 do 4294967296 nie działał dokładnie tak, jak podano, musiałem przejść -1 z tego maksymalnego rozmiaru. Przechowuję duże obiekty BLS JSON i czasami mogą być szalone ogromne.
Oto moja migracja z większą wartością i wartością, na którą MySQL nie narzeka.
Uwaga 5 na końcu limitu zamiast 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
Jeśli atrybut jest zgodny f.text_field
z formularzem, użyj ciągu znaków , jeśli jest zgodny, f.text_area
użyj tekstu .
:text
. Patrz depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text