MySQL: Почему использование VARCHAR (20) вместо VARCHAR (255)? [дубликат]

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

Во-первых, я не получаю никакой ошибки синтаксического анализа, пока я удаляю ложные отступы в начале. Вместо этого я получаю эту ошибку:

main.hs:11:17: error:
    Not in scope: type constructor or class ‘Punkt..’
    No module named ‘Punkt’ is imported.

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

data Streckenzug = Streckenzug {
    streckenzug :: [Punkt] -- Correction here
}  

Когда я исправляю это, ошибки меняются. Давайте перейдем к следующему:

main.hs:15:9: error:
    • Couldn't match expected type ‘Punkt’
                  with actual type ‘(Float, Float)’

Глядя на соответствующую строку, я вижу, что вы не соответствуете на Punkt, но на самом деле на (Float, Float) с. Это тривиально исправить. Вот решение с лучшим отступом:

distanz :: Punkt -> Punkt -> Float
distanz pkt1 pkt2 = sqrt (x' * x' + y' * y') -- Correction here
 where
   x'= x pkt1 - x pkt2
   y'= y pkt1 - y pkt2 -- Note the adjustment here.

Пожалуйста, поймите, что Punkt - это не просто кортеж чисел; он обрабатывается отдельно компилятором.

К сожалению, я попытался бы исправить вашу функцию laenge, но я вообще не могу понять, что вы подразумеваете под ней - типы полностью нарушены, и ваше намерение неясно. Я бы порекомендовал учиться на вышеуказанных ошибках и повторить попытку.

В целом, однако, работает следующий файл:

data Punkt = Punkt 
  { x :: Float
  , y :: Float 
  }

data Streckenzug = Streckenzug {
    streckenzug :: [Punkt]
}  

distanz :: Punkt -> Punkt -> Float
distanz pkt1 pkt2 = sqrt (x' * x' + y' * y')
  where
    x'= x pkt1 - x pkt2
    y'= y pkt1 - y pkt2

Функции p1 и p2 совершенно бесполезны, и поэтому я удалил их; они не только идентичны, но и оба имеют тип p1, p2 :: (a,b) -> (a,b), другими словами p1 = p2 = id.

30
задан Community 23 May 2017 в 12:08
поделиться

6 ответов

Проверьте: Ссылка на Varchar

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

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

28
ответ дан 27 November 2019 в 23:53
поделиться

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

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

17
ответ дан Dan Diplo 27 November 2019 в 23:53
поделиться

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

2
ответ дан Martin v. Löwis 27 November 2019 в 23:53
поделиться

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

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

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

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

1
ответ дан OneNerd 27 November 2019 в 23:53
поделиться

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

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

1
ответ дан Mitchel Sellers 27 November 2019 в 23:53
поделиться

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

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

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

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

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

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

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

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

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

5
ответ дан 27 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: