Почему, если я создаю varchar(65535), я получаю mediumtext?

#mysql #text #varchar

#mysql #текст #varchar

Вопрос:

mediumtext и varchar(65535) — это одно и то же? Я имею в виду, что они оба хранят данные непосредственно в таблице или тип mediumtext хранит указатель? Я спрашиваю об этом, потому что, если я попытаюсь создать varchar(65535), он автоматически преобразуется в mediumtext (если длина на самом деле больше 21811).


У меня есть еще один связанный с этим вопрос, который:

У меня есть несколько полей в таблице, в которых я хочу иметь возможность хранить много символов (около 10 000). Но на самом деле он почти все время будет хранить не более 10 символов.

Итак, мой вопрос в том, нужно ли мне использовать тип text или varchar(10000) для лучшей производительности?

Я считаю, что тип varchar более подходит для этого случая.

Заранее спасибо за ваши ответы.

Редактировать

Я не понимаю, почему они говорят, что начиная с mysql 5.0.3 мы можем создать varchar(65535), но когда мы пытаемся это сделать, он преобразует его в mediumtext. Для меня разница между varchar и text (включая mediumtext) заключается в том, как они хранятся (с использованием указателя или нет). Так почему они говорят, что мы можем создать varchar с длиной 65535, если мы не можем?

Комментарии:

1. google? dev.mysql.com/doc/refman/5.1/en/storage-requirements.html

Ответ №1:

Я отвечаю на свой собственный вопрос:

Это потому, что я использую многобайтовый символ. Если вы используете сопоставление utf-8, вы не сможете создать varchar примерно с более чем 21000 символами. Но если вы используете ascii, вы получите.

Комментарии:

1. Ага! Это имеет смысл, разделите ограничение строки в байтах на три. Спасибо. (Просто убедитесь, что ваша строка UTF-8 содержит только символы UCS-2 😉 … Вау, MySQL 5.5 и далее уже учитывает это, см. dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html

2. Обратите внимание на одну деталь: ограничение 65535 — это не только ограничение Varchar. Это ограничение на размер всей записи. Это означает, что если у вас есть только один Varchar в таблице, вы можете перейти к (65535-3) / 3 = 21844 символа. Но на самом деле вы не сможете перейти к 21844, поскольку другие поля также используют часть доступных 65535 байт.

Ответ №2:

Согласно mysql.com длина mediumtext составляет L 3 байта. Для меня это означает, что если у вас есть пустое поле, оно будет 3 байта. Если у вас пустой varchar, длина этого поля будет равна 1 байту.

Здесь четко указано

До MySQL 5.0.3 столбец VARCHAR со спецификацией длины, превышающей 255, преобразуется в наименьший текстовый тип, который может содержать значения заданной длины. Например, VARCHAR(500) преобразуется в ТЕКСТ, а VARCHAR(200000) преобразуется в MEDIUMTEXT. Однако это преобразование влияет на удаление конечного пробела.