Różnica między tekstem a tekstem w rails?

Robię nową aplikację internetową używając Rails i zastanawiałem się, jaka jest różnica między string a text? A kiedy należy używać każdego z nich?

Author: Amanda S, 2010-07-28

7 answers

Różnica polega na tym, jak symbol jest konwertowany do odpowiedniego typu kolumny w języku zapytań.

Z MySQL: string jest mapowany do 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:

Http://www.packtpub.com/article/Working-with-Rails-ActiveRecord-Migrations-Models-Scaffolding-and-Database-Completion

Kiedy należy stosować każdy z nich?

Jako generał zasada kciuka, użyj :string do wprowadzania krótkiego tekstu (Nazwa użytkownika, adres e-mail, Hasło, tytuły itp.) i używać :text dla dłuższych oczekiwanych danych wejściowych, takich jak opisy, Treść komentarza itp.

 476
Author: TJ Koblentz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-11 05:41:35

Jeśli używasz postgres użyj tekstu, gdzie tylko możesz, chyba że masz ograniczenie rozmiaru, ponieważ nie ma kary za wydajność dla tekstu vs varchar

Nie ma różnicy w wydajności między tymi trzema typami, oprócz zwiększonej przestrzeni dyskowej podczas korzystania z typu pusto wyściełanego i kilku dodatkowych cykli procesora, aby sprawdzić długość podczas przechowywania w kolumnie o ograniczonej długości. Podczas gdy znak (n) ma zalety wydajności w niektórych innych systemach bazodanowych, 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żyć tekstu lub znaku

PostsgreSQL manual

 144
Author: Omar Qureshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 15:53:17

String tłumaczy 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ść.

Do dogłębnej analizy z dobrymi referencjami sprawdź http://www.pythian.com/news/7129/text-vs-varchar/

Edit: niektóre silniki baz danych mogą załadować varchar za jednym zamachem, ale przechowują tekst (i blob) poza tabelą. A SELECT name, amount FROM products może być o wiele wolniejsze, gdy używasz text dla name, niż gdy używasz varchar. A ponieważ Rails, domyślnie ładuje rekordy za pomocą SELECT * FROM... twoje kolumny tekstowe zostaną załadowane. To prawdopodobnie nigdy nie będzie prawdziwym problemem w twojej lub mojej aplikacji, chociaż (przedwczesna optymalizacja jest ...). Ale wiedząc, że tekst nie zawsze jest "wolny" jest dobrze wiedzieć.

 17
Author: berkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-13 07:55:17

Jak wyjaśniono powyżej, nie tylko typ danych db, wpłynie to również na widok, który zostanie wygenerowany, jeśli jesteś rusztowaniem. string wygeneruje text_field tekst wygeneruje text_area

 10
Author: ajet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-16 11:17:13

String, jeśli rozmiar jest stały i mały, a tekst, jeśli jest zmienny i duży. Jest to dość ważne, ponieważ tekst jest znacznie większy niż ciągi. Zawiera dużo więcej kilobajtów.

Więc dla małych pól Zawsze używaj string (varchar). Pola jak. first_name, login, e-mail, temat (artykułu lub postu) oraz przykładowe teksty: treść / treść postu lub artykułu. pola do akapitów itp

Rozmiar łańcucha od 1 do 255 (domyślnie = 255)

Rozmiar tekstu od 1 do 4294967296 (domyślnie = 65536)2

 10
Author: Gurudath BN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-04 05:22:31

Użyj ciągu znaków dla krótszego pola, np. nazwy, adresu, telefonu, firmy

Użyj tekstu dla większej zawartości, komentarzy, treści, akapitów.

Moja ogólna zasada, jeśli jest to coś, co jest więcej niż jedna linijka, zazwyczaj idę na tekst, jeśli jest to krótkie 2-6 słów, idę na ciąg.

Oficjalna reguła to 255 Dla ciągu znaków. Tak więc, jeśli ciąg znaków jest więcej niż 255 znaków, przejdź do tekstu.

 1
Author: user2012677,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 03:18:44

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 }
}

Https://github.com/rsim/oracle-enhanced/blob/master/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb

 0
Author: Luis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 07:46:21