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

Odpowiednik varchar(max) w MySQL?

Maksymalna długość zmiennej zależy od maksymalnego rozmiaru wiersza w MySQL, który wynosi 64 KB (nie licząc bloków BLOB):

VARCHAR(65535)

Pamiętaj jednak, że limit jest niższy, jeśli używasz zestawu znaków wielobajtowych:

VARCHAR(21844) CHARACTER SET utf8

Oto kilka przykładów:

Maksymalny rozmiar wiersza to 65535, ale varchar zawiera również bajt lub dwa kodujące długość danego ciągu. Tak więc w rzeczywistości nie można zadeklarować zmiennej o maksymalnym rozmiarze wiersza, nawet jeśli jest to jedyna kolumna w tabeli.

mysql> CREATE TABLE foo ( v VARCHAR(65534) );
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

Ale jeśli spróbujemy zmniejszyć długość, znajdziemy największą, która działa:

mysql> CREATE TABLE foo ( v VARCHAR(65532) );
Query OK, 0 rows affected (0.01 sec)

Teraz, jeśli spróbujemy użyć wielobajtowego zestawu znaków na poziomie tabeli, stwierdzimy, że liczy on każdy znak jako wiele bajtów. Łańcuchy UTF8 nie koniecznie używaj wielu bajtów na ciąg, ale MySQL nie może zakładać, że ograniczysz wszystkie przyszłe wstawki do znaków jednobajtowych.

mysql> CREATE TABLE foo ( v VARCHAR(65532) ) CHARSET=utf8;
ERROR 1074 (42000): Column length too big for column 'v' (max = 21845); use BLOB or TEXT instead

Pomimo tego, co powiedział nam ostatni błąd, InnoDB nadal nie lubi długości 21845.

mysql> CREATE TABLE foo ( v VARCHAR(21845) ) CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

To ma sens, jeśli obliczysz, że 21845*3 =65535, co i tak by nie zadziałało. Podczas gdy 21844*3 =65532, co działa.

mysql> CREATE TABLE foo ( v VARCHAR(21844) ) CHARSET=utf8;
Query OK, 0 rows affected (0.32 sec)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przewodnik po projektowaniu bazy danych dla powiadomień w MySQL

  2. Wprowadzenie do przełączania awaryjnego dla replikacji MySQL — blog 101

  3. Policz z warunkiem IF w zapytaniu MySQL

  4. MySQL ZAMÓW PRZEZ IN()

  5. Aplikacja z listą rzeczy do zrobienia używająca PHP i bazy danych MySQL