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


Ответы:


195

Максимальная длина 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)

20
Я также предложил бы использовать ТЕКСТ
Ади

2
@AdnanShammout: Конечно, если только вы не хотите объявить DEFAULTзначение для столбца. Не может сделать это с типами TEXT или BLOB.
Билл Карвин

5
@DanW, TEXTограничение длины составляет 64 КБ . MEDIUMTEXTпредел длины составляет 16 мес. LONGTEXTпредел длины 4G.
Билл Карвин

4
Самая большая проблема в том, что если вы создаете столбец такого размера, вы можете иметь только один столбец в вашей таблице. MAX размер строки в MySql является 64k, поэтому если у вас есть 64k столбец, это все , что вы получите. Это же ограничение не относится к varchar(max)типу столбцов Sql Server .
Joshperry

1
@joshperry, да, но столбцы TEXT / BLOB учитывают только небольшое количество (9-12 байт) для ограничения размера строки в 64 КБ, поэтому, если вам нужен большой VARCHAR, а также ряд других столбцов, лучше использовать TEXT.
Билл Карвин

74

TLDR; MySql не имеет эквивалентной концепции varchar(max), это функция MS SQL Server.

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

varchar(max) это особенность Microsoft SQL Server.

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

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

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

Поскольку данные в столбце MAX заполняют страницу данных 8 КБ, выделяется страница переполнения, и предыдущая страница указывает на нее, образуя связанный список. В отличие TEXT, NTEXTи тип столбца поддерживает все те же семантика запроса как другие типы столбцов.BLOBvarchar(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.


1
Это больше связано с SQL Server, чем с MySQL.
Кермит

14
@njk Да, но чтобы объяснить, что такое «эквивалент» в MySql (или отсутствие эквивалента в данном случае), необходимо было описать, что именно означает на varchar(max) самом деле .
Joshperry

29

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

65535

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

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

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

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


Мне нравится формат вашего ответа, но в нем, похоже, отсутствует некоторая полезная информация, которую дает лучший ответ относительно кодировок и прочего
Джо Филлипс,

3

Для сервера Sql

изменить таблицу prg_ar_report_colors добавить Text_Color_Code VARCHAR (макс);

Для MySql

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

Для Oracle

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


1
обратите внимание, что longtext, text и blob хранятся не так, как varchar. varchar хранится с другими полями, а текст хранится в отдельном файле на сервере. у этого есть за и против, настолько осторожные, какой выбрать
santiago arizti

0

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>

-11

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.