Эквивалент varchar (max) в MySQL? - PullRequest
155 голосов
/ 02 декабря 2008

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

Ответы [ 6 ]

176 голосов
/ 02 декабря 2008

Максимальная длина 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)
70 голосов
/ 02 декабря 2008

Что такое 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.

27 голосов
/ 02 декабря 2008

Максимальная длина varchar

65535

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

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

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

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

3 голосов
/ 02 декабря 2016

Для 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;

0 голосов
/ 11 июня 2015

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>
0 голосов
/ 18 июня 2014

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

...