Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Różnica między VARCHAR i TEXT w MySQL

TL;DR

TEXT

  • stały maksymalny rozmiar 65535 znaków (nie można ograniczyć maksymalnego rozmiaru)
  • zajmuje 2 + c bajtów miejsca na dysku, gdzie c to długość przechowywanego ciągu.
  • nie może być (w pełni) częścią indeksu. Trzeba by określić długość prefiksu.

VARCHAR(M)

  • zmienny maksymalny rozmiar M postacie
  • M musi wynosić od 1 do 65535
  • przyjmuje 1 + c bajty (dla M ≤ 255) lub 2 + c (dla 256 ≤ M ≤ 65535) bajtów miejsca na dysku, gdzie c to długość przechowywanego ciągu
  • może być częścią indeksu

Więcej szczegółów

TEXT ma stały maksymalny rozmiar 2¹⁶-1 = 65535 znaków.
VARCHAR ma zmienną maksymalny rozmiar M do M = 2¹⁶-1 .
Więc nie możesz wybrać rozmiaru TEXT ale możesz dla VARCHAR .

Inna różnica polega na tym, że nie można umieścić indeksu (z wyjątkiem indeksu pełnotekstowego) na TEXT kolumna.
Więc jeśli chcesz mieć indeks na kolumnie, musisz użyć VARCHAR . Zauważ jednak, że długość indeksu jest również ograniczona, więc jeśli twój VARCHAR kolumna jest za długa, musisz użyć tylko pierwszych kilku znaków VARCHAR kolumna w indeksie (Zobacz dokumentację CREATE INDEX ).

Ale chcesz również użyć VARCHAR , jeśli wiesz, że maksymalna długość możliwego ciągu wejściowego to tylko M , np. numer telefonu, nazwisko lub coś w tym stylu. Następnie możesz użyć VARCHAR(30) zamiast TINYTEXT lub TEXT a jeśli ktoś spróbuje zapisać tekst wszystkich trzech książek „Władca Pierścienia” w kolumnie numeru telefonu, zachowasz tylko pierwsze 30 znaków :)

Edytuj: Jeśli tekst, który chcesz przechowywać w bazie danych jest dłuższy niż 65535 znaków, musisz wybrać MEDIUMTEXT lub LONGTEXT , ale bądź ostrożny:MEDIUMTEXT przechowuje ciągi do 16 MB, LONGTEXT do 4 GB. Jeśli używasz LONGTEXT i pobierz dane przez PHP (przynajmniej jeśli używasz mysqli bez store_result ), może pojawić się błąd alokacji pamięci, ponieważ PHP próbuje przydzielić 4 GB pamięci, aby mieć pewność, że cały ciąg może być buforowany. Może się to również zdarzyć w innych językach niż PHP.

Jednak powinieneś zawsze sprawdź dane wejściowe (Czy jest za długie? Czy zawiera dziwny kod?) przed przechowywanie go w bazie danych.

Uwaga:w przypadku obu typów wymagane miejsce na dysku zależy tylko od długości przechowywanego ciągu, a nie od maksymalnej długości.
Np. jeśli używasz zestawu znaków latin1 i przechowujesz tekst "Test" w VARCHAR(30) , VARCHAR(100) i TINYTEXT , zawsze wymaga 5 bajtów (1 bajt do przechowywania długości łańcucha i 1 bajt na każdy znak). Jeśli przechowujesz ten sam tekst w VARCHAR(2000) lub TEXT kolumny, wymagałoby to również tej samej przestrzeni, ale w tym przypadku byłoby to 6 bajtów (2 bajty do przechowywania długości łańcucha i 1 bajt na każdy znak).

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją .

Na koniec chcę dodać informację, że oba, TEXT i VARCHAR są typami danych o zmiennej długości, więc najprawdopodobniej minimalizują one przestrzeń potrzebną do przechowywania danych. Ale wiąże się to z kompromisem w stosunku do wydajności. Jeśli potrzebujesz lepszej wydajności, musisz użyć typu o stałej długości, takiego jak CHAR . Więcej informacji o tym tutaj .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. CROSS/OUTER APPLY w MySQL

  2. PHP PDOException:SQLSTATE[HY093]:Nieprawidłowy numer parametru

  3. Jak skonfigurować Tomcata do połączenia z MySQL?

  4. Jak korzystać z ról, które zmieniły się w MySQL 8.0?

  5. Różnica między kluczem, kluczem podstawowym, kluczem unikalnym i indeksem w MySQL