Существуют ли какие-либо ограничения для ТЕКСТОВОГО поля в одной строке?

#mysql

#mysql

Вопрос:

Мне нужно разработать международный веб-сайт. Допустим, у меня есть таблица под названием Article:

 articleID | data | text_EN | text_FR | text_DE | text_ES
  

Как вы можете видеть, одна строка содержит каждую переведенную версию текста. Учитывая, что каждое текстовое поле для каждого языка содержит около 1500 символов, у mysql могут возникнуть какие-либо проблемы с управлением такой таблицей?

Однажды я слышал, что существует жесткое ограничение на то, сколько места может занимать одна строка.

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

1. Что происходит, когда вам нужно добавить другой язык? Вы изменяете таблицу?

2. ДА.. Таким образом, я могу получить более простой запрос, чем объединение с таблицей, содержащей 1 язык для каждой записи

3. Это плохой подход к разработке вашего приложения подобным образом..

4. В данном случае я чувствую себя совершенно комфортно только при таком подходе. И это не похоже на то, что я добавляю язык каждый день. 🙂

Ответ №1:

В MySQL действительно существует ограничение на размер строки (64 КБ для MyISAM, около 8 КБ для InnoDB IIRC), но это не будет иметь большого значения, если вы используете поля TEXT или BLOB .

Такие поля на самом деле являются указателями, сами данные хранятся за пределами строки. Каждое TEXT поле будет занимать от 9 до 12 байт места в строке, в соответствии с требованиями к хранению.

Тем не менее, я бы поддержал совет @ Bill: переводы статей лучше хранить в строках, а не в столбцах.

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

1. Скорее всего, нет, поскольку ваши пять text_XX полей займут не более 60 байт памяти строки.

Ответ №2:

Хорошо, насколько я знаю, у всего есть свой предел.

Вы можете найти больше информации здесь.

http://www.electrictoolbox.com/maximum-length-mysql-text-field-types/

Но я думаю, что проблема будет решена, когда вы прочтете это.

Ответ №3:

Описать ограничение длины строки сложно. Подробности смотрите в этом блоге: Хранилище больших двоичных объектов в InnoDB.

Но я бы настоятельно рекомендовал вам не сохранять текст в таких столбцах. Хранить в строках вместо:

 CREATE TABLE Article (
  articeID INT NOT NULL AUTO_INCREMENT,
  language CHAR(2) NOT NULL,
  article_text TEXT,
  PRIMARY KEY (articleID, language)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  

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

1. эта конкретная таблица не может работать для меня, потому что мне нужно сохранить другое поле, слишком независимое от языка, и это приведет к избыточности. Если я хочу нормализовать свою схему, я должен создать вторую таблицу, содержащую только переведенный текст, но это вызвало бы более сложный запрос, а я хочу, чтобы запрос был как можно более простым.