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


Відповіді:


195

Максимальна довжина вархара залежить від максимального розміру рядка в MySQL, який становить 64 КБ (без урахування BLOB):

VARCHAR(65535)

Однак зауважте, що обмеження є нижчим, якщо ви використовуєте багатобайтовий набір символів:

VARCHAR(21844) CHARACTER SET utf8

Ось кілька прикладів:

Максимальний розмір рядка - 65535, але варчар також включає байт або два для кодування довжини заданого рядка. Таким чином, ви фактично не можете оголосити варшар максимального розміру рядків, навіть якщо це єдиний стовпець у таблиці.

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
Я також пропоную використовувати TEXT
Adi

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

5
@DanW, TEXTобмеження довжини - 64K. MEDIUMTEXTобмеження довжини - 16М. LONGTEXTобмеження довжини - 4G.
Білл Карвін

4
Найбільша проблема полягає в тому , що якщо створити стовпець такого розміру, ви можете мати тільки що один стовпець в таблиці. Розмір рядка MAX в MySql становить 64 к, тому якщо у вас стовпець 64 к, це все, що ви отримуєте. Це ж обмеження не застосовується до varchar(max)типу стовпців сервера Sql .
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

Максимальна довжина варшара становить

65535

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

мінус 2 байти для збереження довжини

мінус довжина всіх інших стовпців

мінус 1 байт на кожні 8 стовпців, які є нульовими. Якщо ваш стовпець є null / not null, він зберігається як один біт у байтах / байтах, званих нульовою маскою, 1 біт на стовпчик, який є нульовим.


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

3

Для сервера Sql

змінити таблицю prg_ar_report_colors додати Text_Color_Code VARCHAR (макс.);

Для MySql

змінити таблицю prg_ar_report_colors додати довгий текст Text_Color_Code;

Для Oracle

змінити таблицю prg_ar_report_colors додати Text_Color_Code CLOB;


1
зауважте, що довгий текст, текст і крапка зберігаються інакше, ніж варчар. varchar зберігається з іншими полями, тоді як текст зберігається в окремому файлі на сервері. У нього є плюси і мінуси, настільки обережні, який вибрати
Сантьяго Арісті

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>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.