Вопрос

Каков эквивалент varchar(max) в MySQL?

Это было полезно?

Решение

Максимальная длина varchar зависит от максимального размера строки в MySQL, который составляет 64 КБ (не считая 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)

Другие советы

Что такое VARCHAR (макс.)?

varchar (max) - это функция Microsoft SQL Server.

Объем данных, которые столбец мог хранить в версиях сервера Microsoft SQL до версии 2005, был ограничен 8 КБ. Чтобы хранить более 8 КБ, вам пришлось бы использовать типы столбцов TEXT , NTEXT или BLOB , эти типы столбцов сохраняли свои данные как коллекция из 8К страниц отдельно от таблиц с данными страниц; они поддерживали хранение до 2 ГБ на строку.

Большим предостережением для этих типов столбцов было то, что им обычно требовались специальные функции и операторы для доступа и изменения данных (например, READTEXT , WRITETEXT и UPDATETEXT )

В SQL Server 2005 varchar (max) был введен для объединения данных и запросов, используемых для извлечения и изменения данных в больших столбцах. Данные для столбцов varchar (max) хранятся на одной странице со страницами данных таблицы.

Когда данные в столбце MAX заполняют страницу данных 8 КБ, выделяется страница переполнения, и предыдущая страница указывает на нее, образуя связанный список. В отличие от TEXT , NTEXT и BLOB тип столбца varchar (max) поддерживает все те же семантики запросов, что и другие типы столбцов.

Итак, varchar (MAX) действительно означает varchar (AS_MUCH_AS_I_WANT_TO_STUFF_IN_HERE_JUST_KEEP_GROWING) , а не varchar (MAX_SIZE_OF_A_COLUMN) .

MySql не имеет эквивалентной идиомы.

Чтобы получить тот же объем памяти, что и varchar (max) в MySql, вам все равно потребуется использовать тип столбца BLOB . В этой статье обсуждается очень эффективный метод эффективного хранения больших объемов данных в MySql.

Максимальная длина переменной равна

65535

деленное на максимальную длину байта символа в наборе символов, значение которого задано для столбца (напримерutf8=3 байта, ucs2=2, latin1=1).

минус 2 байта для хранения длины

минус длина всех остальных столбцов

минус 1 байт за каждые 8 столбцов, которые можно обнулить.Если ваш столбец равен null / не not null, он сохраняется как один бит в байте / байтах, называемых маской null, по 1 биту на столбец, который можно обнулить.

Для Sql Server

изменить таблицу prg_ar_report_colors add Text_Color_Code VARCHAR (max);

Для MySql

изменить таблицу prg_ar_report_colors add Text_Color_Code longtext;

для Oracle

изменить таблицу prg_ar_report_colors add Text_Color_Code CLOB;

Mysql Преобразование столбца из VARCHAR в TEXT при ограниченном размере !!!

mysql> CREATE TABLE varchars1(ch3 varchar(6),ch1 varchar(3),ch varchar(4000000))
;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------------------------+
| Level | Code | Message                                     |
+-------+------+---------------------------------------------+
| Note  | 1246 | Converting column 'ch' from VARCHAR to TEXT |
+-------+------+---------------------------------------------+
1 row in set (0.00 sec)

mysql>

Максимальная длина varchar в MySQL 5.6.12 составляет 4294967295.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top