Why does VARCHAR need length specification?

SqlDatabaseVarchar

Sql Problem Overview


Why do we always need to specify VARCHAR(length) instead of just VARCHAR? It is dynamic anyway.

UPD: I'm puzzled specifically by the fact that it is mandatory (e.g. in MySQL).

Sql Solutions


Solution 1 - Sql

The "length" of the VARCHAR is not the length of the contents, it is the maximum length of the contents.

The max length of a VARCHAR is not dynamic, it is fixed and therefore has to be specified.

If you don't want to define a maximum size for it then use VARCHAR(MAX).

Solution 2 - Sql

First off, it does not needed it in all databases. Look at SQL Server, where it is optional.

Regardless, it defines a maximum size for the content of the field. Not a bad thing in itself, and it conveys meaning (for example - phone numbers, where you do not want international numbers in the field).

Solution 3 - Sql

You can see it as a constraint on your data. It ensures that you don't store data that violates your constraint. It is conceptionally similar to e.g. a check constraint on a integer column that ensure that only positive values are entered.

Solution 4 - Sql

The more the database knows about the data it is storing, the more optimisations it can make when searching/adding/updating data with requests.

Solution 5 - Sql

The answer is you don't need to, it's optional.

It's there if you want to ensure that strings do not exceed a certain length.

Solution 6 - Sql

From Wikipedia:

> Varchar fields can be of any size up > to the limit. The limit differs from > types of databases, an Oracle 9i > Database has a limit of 4000 bytes, a > MySQL Database has a limit of 65,535 > bytes (for the entire row) and > Microsoft SQL Server 2005 8000 bytes > (unless varchar(max) is used, which > has a maximum storage capacity of > 2,147,483,648 bytes).

Solution 7 - Sql

The most dangerous thing for programmers, as @DimaFomin pointed out in comments, is the default length enforced, if there is no length specified.

How SQL Server enforces the default length:

declare @v varchar = '123'
select @v

result:

1

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionFixpointView Question on Stackoverflow
Solution 1 - SqlRobin DayView Answer on Stackoverflow
Solution 2 - SqlOdedView Answer on Stackoverflow
Solution 3 - Sqla_horse_with_no_nameView Answer on Stackoverflow
Solution 4 - SqlTom GullenView Answer on Stackoverflow
Solution 5 - SqlNibblyPigView Answer on Stackoverflow
Solution 6 - SqlLuca MatteisView Answer on Stackoverflow
Solution 7 - SqlthemefieldView Answer on Stackoverflow