MySQL: зачем использовать VARCHAR (20) вместо VARCHAR (255)?

Возможный дубликат:
Есть ли недостатки в использовании универсальной переменной varchar (255) для всех текстовых полей?

В MYSQL вы можете выбрать длину для типа поля VARCHAR. Возможные значения: 1-255.

Но каковы его преимущества, если вы используете максимум VARCHAR (255) вместо VARCHAR (20)? Насколько мне известно, размер записей зависит только от реальной длины вставленной строки.

размер (байты) = длина + 1

Итак, если у вас есть слово «Пример» в поле VARCHAR (255), оно будет иметь 8 байтов. Если у вас есть это в поле VARCHAR (20), у него тоже будет 8 байтов. В чем разница?

Я надеюсь, что вы можете мне помочь. Заранее спасибо!


person caw    schedule 11.08.2009    source источник


Ответы (6)


Отъезд: Справочник по Varchar

Короче говоря, особой разницы нет, если вы не превысите размер 255 в своем VARCHAR, что потребует еще одного байта для префикса длины.

Длина указывает на большее ограничение данных, хранящихся в столбце, чем на что-либо еще. Это по своей сути также ограничивает МАКСИМАЛЬНЫЙ размер хранилища для столбца. IMHO, длина должна иметь смысл в отношении данных. Если вы храните номер социального страхования #, нет смысла устанавливать длину 128, даже если это ничего не стоит в хранилище, если все, что вы на самом деле храните, - это SSN.

person RC.    schedule 11.08.2009
comment
что означает (20)? очевидно, это длина, но длина чего? - person NIMISHAN; 03.05.2018
comment
@NIMISHAN (20) - длина строки, которую вы вставляете в таблицу. предположим, что номер социального страхования состоит из 9 цифр, поэтому его длина равна 9, и его можно легко поместить в столбец типа данных VARCHAR (20), но это вызовет ошибку в VARCHAR (2) - person Shubham Shaw; 18.08.2020

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

Например, если вы храните почтовый индекс Великобритании, вам нужно всего 8 символов. Установка этого ограничения помогает прояснить тип данных, которые вы храните. Если вы выберете 255 символов, это просто запутает ситуацию.

person Dan Diplo    schedule 11.08.2009
comment
+1 за подчеркивание ясности и разборчивости. Я бы определенно поставил под сомнение использование buf [1024], new DynamicBuf(1024) или VARCHAR (255) для хранения, например, одного IP-адреса, разделенного точками. Кодировщик знал, что делал? - person pilcrow; 11.08.2009
comment
+1 И если вы выберете VARCHAR (8) для почтовых индексов Великобритании, используйте CHAR (8) для производительности :) - person Al.; 11.08.2009
comment
Если вы хотите сохранить 8-значный почтовый индекс, вам следует использовать вместо него CHAR (8). Лучше избегать наличия столбца VARCHAR в таблице, так как он заставляет переменную длину строки и более медленный поиск в таблице. Однако, если у вас не может быть всех столбцов фиксированной длины, это не имеет значения. - person Josef Kufner; 09.09.2013
comment
Почтовые индексы @JosefKufner UK не всегда состоят из 8 символов, они различаются по длине. 8 - самый длинный ТЕКУЩИЙ, но он может варьироваться от 6 до 8 символов. Таким образом, вероятно, следует использовать VARCHAR - person ydaetskcoR; 19.11.2013
comment
CHAR (8) заполнит более короткую строку пробелами, а затем удалит эти пробелы при получении значения. CHAR не нуждается в хранении длины строки - VARCHAR (8) требует 9 байтов, а CHAR (8) - только 8 байтов. Следовательно, CHAR (8) все еще более эффективен, если большинство почтовых индексов состоит из 8 символов. - person Josef Kufner; 20.11.2013
comment
CHARS также обычно работают лучше, чем VARCHAR - dba.stackexchange.com/questions/424/ - person Dan Diplo; 21.11.2013

Я не знаю о mySQL, но в SQL Server он позволяет вам определять поля таким образом, чтобы общее количество используемых байтов было больше, чем общее количество байтов, которые фактически могут быть сохранены в записи. Это плохо. Рано или поздно вы получите строку, в которой достигнут предел и вы не можете вставить данные.

Гораздо лучше спроектировать структуру вашей базы данных с учетом ограничений на размер строк.

Кроме того, да, вы не хотите, чтобы люди помещали 200 символов в поле, где максимальное значение должно быть 10. Если они это сделают, это почти всегда неверные данные.

Вы говорите, что я могу ограничить это на уровне приложения. Но данные не попадают в базу данных только из одного приложения. Иногда его используют несколько приложений, иногда данные импортируются, а иногда исправляются вручную из окна запроса (например, обновите все записи, чтобы добавить 10% к цене). Если какой-либо из этих других источников данных не знает о правилах, которые вы вводите в свое приложение, у вас будут плохие, бесполезные данные в вашей базе данных. Целостность данных должна быть обеспечена на уровне базы данных (что не мешает вам также проверять, прежде чем вы попытаетесь ввести данные), иначе у вас нет целостности. Кроме того, по моему опыту, люди, которые слишком ленивы при проектировании своей базы данных, часто также слишком ленивы, чтобы на самом деле вводить ограничения в приложение, а проверка целостности данных вообще отсутствует.

У них есть слово для баз данных без целостности данных - бесполезно.

person HLGEM    schedule 12.08.2009

Существует семантическая разница (и я считаю, что это единственное отличие): если вы попытаетесь заполнить 30 непробельных символов в varchar (20), это приведет к ошибке, тогда как для varchar (255) это будет успешно. Так что это в первую очередь дополнительное ограничение.

person Martin v. Löwis    schedule 11.08.2009
comment
Но разве не ясно, что 30 символов не помещаются в 20-байтовое поле? - person caw; 11.08.2009
comment
Как вы говорите, представление хранилища действительно не заботится о длине: поле, объявленное varchar (20), может хранить 30 символов, что касается представления на диске - я думал, что это наблюдение было ядром вашего вопроса (почему бы и нет всегда использовать varchar (255)?) Теперь я говорю вам причину, по которой вы устанавливаете varchar (20): потому что вы хотите ошибку, которая возникает, если вы случайно пытаетесь ввести более 20 символы. - person Martin v. Löwis; 11.08.2009
comment
Так это только для проблем с проверкой, верно? - person caw; 11.08.2009
comment
Это также зависит от ваших настроек MySQL. Строка, длина которой превышает максимальный предел для строки varchar, не вызывает ошибки, если параметр SQL Strict не установлен. Если он не установлен, он просто выдает предупреждение, и строка обрезается до максимальной длины. Если вы включите этот параметр, то при попытке этого вы фактически получите сообщение об ошибке. - person Attila; 27.10.2013

Что ж, если вы хотите разрешить более крупную запись или, возможно, ограничить размер записи.

Например, у вас может быть first_name как VARCHAR 20, но, возможно, street_address как VARCHAR 50, поскольку 20 может быть недостаточно места. В то же время вы можете контролировать, насколько большим может стать это значение.

Другими словами, вы установили потолок того, насколько большим может быть конкретное значение, чтобы теоретически предотвратить слишком большой размер таблицы (и, возможно, записей индекса / указателя).

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

person OneNerd    schedule 11.08.2009
comment
Но зачем вообще устанавливать длину 20? Если нет никакой разницы, я могу просто установить 255 для всех полей, не так ли? - person caw; 11.08.2009
comment
см. мою правку - я уточню немного подробнее. - person OneNerd; 11.08.2009
comment
Спасибо. Значит, это не повлияет на преобразование хранилища и производительности, не так ли? Но это может быть полезно, например, если вы хотите обрезать струны, чтобы они не стали длинными. Но вы могли добиться этого и раньше, если бы использовали substr () в PHP или аналогичную функцию на другом языке !? - person caw; 11.08.2009
comment
Разница связана с целостностью данных. Пример из реальной жизни: хранение имен компьютеров Windows в вашей базе данных. Компьютер под управлением Windows не может иметь имя компьютера длиннее 63 байтов. Если вы определяете поле, содержащее имена компьютеров, как varchar (255), вы можете вводить недопустимые имена, которые могут вызвать ошибки, если вы попытаетесь использовать эти имена для доступа к компьютерам. Определение varchar (63) заставляет MySQL отклонять (или усекать) вставки или обновления, длина которых превышает 63 символа (technet.microsoft.com/en-us/library/cc757496 (WS.10) .aspx для получения дополнительной информации об именах компьютеров в Windows 2003) - person shufler; 11.08.2009
comment
Вы не всегда можете гарантировать, что другие программисты будут знать, что нельзя вводить более 63 символов. Устанавливая это в поле, вы заранее предотвращаете возникновение проблем в будущем. - person shufler; 11.08.2009

С точки зрения производительности базы данных я не верю, что будет разница.

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

person Mitchel Sellers    schedule 11.08.2009
comment
Обратите внимание, что использование CHAR ускорит ваш доступ только в том случае, если вся запись имеет фиксированный размер. То есть, если вы используете какой-либо объект переменного размера, вы также можете сделать все из них переменного размера. Вы не получите скорости, используя CHAR в таблице, которая также содержит VARCHAR. ссылка - person Attila; 27.10.2013
comment
Однако вы получаете увеличение размера, поскольку varchar использует на 1 байт больше, чем эквивалент char, если оба всегда будут заполнены до своего максимального значения. Поскольку var char использует 1 байт для объявления размера следующей последовательности символов - person Garret Gang; 07.05.2018