Как ограничить varchar в mysql 5.1?

#mysql

#mysql

Вопрос:

Мне нужно создать столбец в mysql 5.1, который может хранить отзывы пользователей. Это не должно быть слишком длинным, поэтому я думаю, что не более 1000 символов UTF-8.

Вопрос в том, как эффективно представить это в mysql 5.1.

На данный момент у меня есть:

 `description` varchar NOT NULL,
 

Но как ограничить varchar хранение не более 1000 символов UTF-8?

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

1. Это вообще допустимо? Я думаю, вам нужно указать длину с помощью varchar.

2. Но какую длину установить, чтобы указать varchar содержать не более 1000 символов?

Ответ №1:

Из документации:

Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в версиях 5.0.3 и более поздних. Эффективная максимальная длина VARCHAR в MySQL 5.0.3 и более поздних версиях зависит от максимального размера строки (65 535 байт, который является общим для всех столбцов) и используемого набора символов.

Это означает, что вы можете хранить до 65 535 байт в столбце VARCHAR. Однако из обзора строкового типа:

MySQL интерпретирует спецификации длины в определениях символьных столбцов в символьных единицах. (До MySQL 4.1 длины столбцов интерпретировались в байтах.) Это относится к типам CHAR, VARCHAR и TEXT .

Итак, объявите свою таблицу с параметрами сортировки UTF8 и установите длину varchar равной 1000 символов, и MySQL сделает всю работу за вас за кулисами.

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

1. Это varchar(1000) означает не более 1000 символов. Спасибо!

2. Я думаю, что под «символьной единицей» они подразумевают «единицу кода». Для UTF-8 единица кода составляет один байт, но символ может состоять из нескольких единиц. Для UTF-16 единица измерения составляет 2 байта, но символ все равно может состоять из нескольких единиц. Я не могу представить, чтобы MySQL решил это за вас, поскольку ему нужно зарезервировать место. Строка MySQL никогда не превышает 65536 байт, поэтому она не может содержать 65536 многобайтовых / многобайтовых символов UTF-8. Я не совсем уверен в этом (в документации MySQL не совсем ясно, что они подразумевают под «символьной единицей»), но для меня это звучит как единственное объяснение.

3. Все в порядке. Оказывается, мы оба были частично правы. MySQL обрабатывает символы. Тем не менее, он по-прежнему ограничен размером записей 65536, и поэтому поле varchar с сопоставлением utf8 не может быть больше 21844 символов (в его спецификации). Это в основном означает, что MySQL резервирует 3 байта на символы для полей UTF-8, и он просто не может хранить дополнительные символы размером 4 байта в varchar(1) столбце. Удивительно? Возможно, нет. Это MySQL.

4. Было бы лучше, если бы вы могли определить, хотите ли вы, чтобы столбец был байтовым или семантическим символом @Golez, да… Мне нравится ваша наука.

Ответ №2:

Поскольку размер, по-видимому, определен в байтах, … -исправление — Размер поля определяется в «символьных единицах». Немного неясно, что они подразумевают под этим, но я предполагаю, что они имеют в виду «единицы кода«.


Удалена остальная часть подробного объяснения, поскольку это не было (полностью верно).

Исправление. В MySQL вы фактически определяете количество символов в поле. Однако он по-прежнему ограничен границей в 65535 байт. Кроме того, MySQL просто резервирует 3 байта на символ для UTF-8, что означает, что у вас не может быть полей UTF-8 длиной более 21844 символов, и объявление поля als VARCHAR(21900) просто завершится неудачей по этой причине : " Column length too big for column 'field1' (max = 21845); use BLOB or TEXT instead: " . Кстати, число в этом сообщении неверно. Фактический максимальный размер равен 21844. 21845 составляет 1/3 от 65535, но я думаю, вам также нужно вычесть два байта для заголовка размера поля.

Тем не менее, ограничение в 3 байта странно. Определение unicode разработано так, чтобы его можно было расширять дополнительными символами. Уже есть дополнительные символы по 4 байта, которые на самом деле не могут быть сохранены в поле varchar (1) в формате UTF-8 или в любом другом поле varchar, если на то пошло, поскольку MySQL, похоже, просто не может прочитать эти символы : "Incorrect string value: 'xF0xA0x9Cx8E' for column 'field1' at row 1" . Поэтому, я думаю, вам понадобится фактический двоичный / двоичный столбец, чтобы иметь возможность хранить эти символы.

Я думаю, что документация по этому вопросу довольно скудная, но я попробовал кое-что и пришел к такому выводу. Вы можете увидеть скрипку здесь: http://sqlfiddle.com /#!2/4d938

На вопрос:

Итак, для вашей конкретной ситуации объявление поля as varchar(1000) сделает свое дело, предполагая, что вы не хотите, чтобы люди использовали дополнительные символы в своих отзывах.

Некоторые вещи, которые следует учитывать:

  • Я думаю, что поле «обратная связь» из 1000 символов довольно мало. Для многих людей этого будет достаточно, но если вам нужно сказать больше, это раздражает, если вы не можете. Поэтому я бы увеличил поле.
  • поля varchar хранятся в записи и занимают часть максимального размера строки 65536 байт. Это важный факт. У вас не может быть двух полей varchar(20000) подряд, потому что вместе они будут больше, чем этот максимальный размер строки.
    Лучшей альтернативой для больших текстовых полей было бы сделать их TEXT или MEDIUMTEXT, которые могут быть еще больше и хранятся по-другому.

Ответ №3:

Значения в столбцах VARCHAR представляют собой строки переменной длины. Длина может быть указана как значение от 0 до 255 до MySQL 5.0.3 и от 0 до 65 535 в версиях 5.0.3 и более поздних.

http://dev.mysql.com/doc/refman/5.0/en/char.html

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

1. Но как перевести 65 535 байт в количество символов.