Mysql
 sql >> база данни >  >> RDS >> Mysql

Еквивалент на varchar(max) в MySQL?

Максималната дължина на varchar зависи от максималния размер на реда в MySQL, който е 64KB (без да се броят BLOB):

VARCHAR(65535)

Имайте предвид обаче, че ограничението е по-ниско, ако използвате многобайтов набор от знаци:

VARCHAR(21844) CHARACTER SET utf8

Ето няколко примера:

Максималният размер на реда е 65535, но varchar включва също байт или два за кодиране на дължината на даден низ. Така че всъщност не можете да декларирате varchar с максимален размер на ред, дори ако това е единствената колона в таблицата.

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

Но ако се опитаме да намалим дължините, ще намерим най-голямата дължина, която работи:

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

Сега, ако се опитаме да използваме многобайтов набор от знаци на ниво таблица, ще открием, че той отчита всеки знак като множество байта. UTF8 низовете не са непременно използвайте няколко байта на низ, но MySQL не може да приеме, че ще ограничите всичките си бъдещи вмъквания до еднобайтови знаци.

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

Въпреки това, което ни каза последната грешка, InnoDB все още не харесва дължина от 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

Това е напълно логично, ако изчислите, че 21845*3 =65535, което така или иначе не би работило. Докато 21844*3 =65532, което работи.

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. Използване на изгледи на MySQL

  2. Заявката SELECT връща 1 ред от всяка група

  3. Функция MySQL POW() – Повишаване на стойност до степента на друга стойност

  4. Може ли Mysql да раздели колона?

  5. Как да изградим flask приложение около вече съществуваща база данни?