У меня есть таблица сообщений в MySQL, которая записывает сообщения между пользователями. Помимо типичных идентификаторов и типов сообщений (все целые типы), мне нужно сохранить фактический текст сообщения как VARCHAR или TEXT. Я устанавливаю front-end limit из 3000 символов, что означает, что сообщения никогда не будут вставляться в db дольше, чем это.
Есть ли обоснование для перехода с VARCHAR (3000) или TEXT? Там что-то о том, как просто писать VARCHAR (3000), который чувствует себя несколько контр-интуитивным. Я прошел через другие подобные сообщения в Stack Overflow, но было бы неплохо получить представление, специфичное для этого типа общего хранения сообщений.
TEXT и BLOB хранятся за столом, при этом таблица имеет указатель на расположение фактического хранилища.
VARCHAR хранится в строке с таблицей. VARCHAR быстрее, когда размер разумный, компромисс которого будет быстрее зависит от ваших данных и вашего оборудования, вы бы хотели сравнить сценарий реального мира с вашими данными.
Можете ли вы предсказать, как долго будет вводиться пользователь?
УАКСНАК (Х)
Дело: имя пользователя, адрес электронной почты, страна, тема, пароль
ТЕКСТ
Дело: сообщения, электронные письма, комментарии, форматированный текст, html, код, изображения, ссылки
MEDIUMTEXT
Дело: большие тела json, книги с малой длиной до средней длины, строки csv
LONGTEXT
Дело: учебники, программы, летние файлы журналов, Гарри Поттер и кубок огня, ведение научных исследований
Просто для уточнения наилучшей практики:
Сообщения в текстовом формате почти всегда сохраняются как ТЕКСТ (они заканчиваются сколь угодно длинными)
Атрибуты String должны храниться как VARCHAR (имя пользователя-получателя, субъект и т.д.).
Я понимаю, что у вас есть предел переднего конца, и это здорово, пока это не так. * grin * Трюк состоит в том, чтобы думать о БД отдельно от приложений, которые подключаются к нему. Просто потому, что одно приложение ограничивает данные, это не означает, что данные ограничены по существу.
Что происходит с сообщениями, которые заставляют их не больше 3000 символов? Если это просто произвольное ограничение приложения (скажем, для текстового поля или что-то еще), используйте поле TEXT
на уровне данных.
Отказ от ответственности: я не эксперт по MySQL... но это мое понимание проблем.
Я думаю, что TEXT хранится вне строки mysql, в то время как я думаю, что VARCHAR хранится как часть строки. Для строк mysql существует максимальная длина строки, поэтому вы можете ограничить количество других данных, которые вы можете сохранить в строке, используя VARCHAR.
Также из-за того, что VARCHAR является частью строки, я подозреваю, что запросы, смотрящие на это поле, будут немного быстрее, чем при использовании фрагмента TEXT.
varchar
из 3000 символов может занимать до 9000 байт.