常见的MySQL字段及其相应的数据类型

Enr*_*ico 108 mysql database types

我正在建立一个非常小的MySQL数据库,存储,名字,姓氏,电子邮件和电话号码,我正在努力为每个字段找到"完美"的数据类型.我知道没有一个完美的答案,但必须有一些常见的常用惯例,例如这些.例如,我已经确定一个未格式化的美国电话号码太大而无法存储为unsigned int,它必须至少是一个bigint.

因为我相信其他人可能会觉得这很有用,我不想把我的问题限制在我上面提到的字段中.

哪些数据类型适用于常见数据库字段?电话号码,电子邮件和地址等字段?

da5*_*5id 67

有人会发布一个比这更好的答案,但只是想说明个人我永远不会在任何类型的整数字段中存储电话号码,主要是因为:

  1. 你不需要用它做任何算术,并且
  2. 迟早某人会尝试(做类似的事情)在他们的区号附近加上括号.

总的来说,我似乎几乎只使用:

  • INT(11)用于任何ID或引用另一个ID的任何内容
  • 时间戳的DATETIME
  • VARCHAR(255)保证不超过255个字符(页面标题,名称等)
  • TEXT几乎所有其他内容.

当然也有例外,但我发现它涵盖了大多数可能性.

  • 再加上它是错的.比我更聪明的人告诉我,当我开始(通过数据库)只是因为看起来像一个数字并不意味着它或应该被视为这样...... (28认同)
  • 盲目地使用varchar(255)是一个坏主意.至少应用一些基本的努力来猜测长度. (14认同)
  • @Raveren:这是特定于存储引擎的 - 并且存储不是唯一的成本.排序数据和临时表(内存引擎)将使用固定数量. (7认同)
  • @Morgan Tocker:这是最好的做法,任何低于255个字符的内容都会占用相同的空间. (4认同)
  • @Omeid Herat是的. (3认同)
  • 此外,整数仅支持高达20亿的价值.这是2,000,000,000.当您想要存储国际电话号码时,实际上没有足够的空间,并附有国家/地区代码.我甚至没有看到你如何找到足够的空间来存储655-405-4055(6,554,054,055)这样的数字 (2认同)
  • 电话号码实际上**是**数字,但仅限于文字理解.0004194821947产生与004194821947相同的整数*数字*,但它在呼叫路由机制中绝对不会以相同的方式处理. (2认同)

yen*_*sun 36

以下是我使用的一些常见数据类型(虽然我不是很专业):

| Column           | Data type     | Note
| ---------------- | ------------- | -------------------------------------
| id               | INTEGER       | AUTO_INCREMENT, UNSIGNED                                                          |  
| uuid             | CHAR(36)      | or CHAR(16) binary                                                                |  
| title            | VARCHAR(255)  |                                                                                   |  
| full name        | VARCHAR(70)   |                                                                                   |  
| gender           | TINYINT       | UNSIGNED                                                                          |  
| description      | TINYTEXT      | often may not be enough, use TEXT 
                                     instead          
| post body        | TEXT          |                                                                                   |  
| email            | VARCHAR(255)  |                                                                                   |  
| url              | VARCHAR(2083) | MySQL version < 5.0.3 - use TEXT                                                  |  
| salt             | CHAR(x)       | randomly generated string, usually of 
                                     fixed length (x)    
| digest (md5)     | CHAR(32)      |                                                                                   |  
| phone number     | VARCHAR(20)   |                                                                                   |  
| US zip code      | CHAR(5)       | Use CHAR(10) if you store extended 
                                     codes      
| US/Canada p.code | CHAR(6)       |                                                                                   |  
| file path        | VARCHAR(255)  |                                                                                   |  
| 5-star rating    | DECIMAL(3,2)  | UNSIGNED                                                                          |  
| price            | DECIMAL(10,2) | UNSIGNED                                                                          |  
| date (creation)  | DATE/DATETIME | usually displayed as initial date of 
                                     a post                                       |  
| date (tracking)  | TIMESTAMP     | can be used for tracking changes in a 
                                     post                                        |  
| tags, categories | TINYTEXT      | comma separated values *                                                          |  
| status           | TINYINT(1)    | 1 – published, 0 – unpublished, … You 
                                     can also use ENUM for human-readable 
                                     values
| json data        | JSON          | or LONGTEXT       
Run Code Online (Sandbox Code Playgroud)

  • @yentsun - 电子邮件实际上只有254; 阅读[对Neil McGuigan发布的问题的评论](http://stackoverflow.com/questions/1199190/what-is-the-optimal-length-for-an-email-address-in-a-database#1199238) (4认同)

sta*_*san 16

根据我的经验,名字/姓氏字段应至少为48个字符 - 来自马来西亚或印度等一些国家的名称很长.

电话号码和邮政编码应始终视为文本,而不是数字.给出的正常理由是有一些以0开头的邮政编码,在某些国家,电话号码也可以从0开头.但真正的原因是它们不是数字 - 它们是碰巧组成的标识符数字的数字(并且忽略了像加拿大这样在其邮政编码中有字母的国家).因此,将它们存储在文本字段中.

在MySQL中,您可以将VARCHAR字段用于此类信息.虽然它听起来很懒惰,但这意味着你不必太在意正确的最小尺寸.


nic*_*ckf 9

由于您将要处理可变长度的数据(名称,电子邮件地址),因此您需要使用VARCHAR.VARCHAR字段占用的空间量为[field length]+ 1个字节,最大长度为255,因此我不会太担心尝试找到完美的大小.看看你想象的可能是最长的长度,然后加倍并将其设置为VARCHAR限制.那说......:

我通常将电子邮件字段设置为VARCHAR(100) - 我还没有提出问题.名称我设置为VARCHAR(50).

正如其他人所说,电话号码和邮政编码实际上并不是数字值,它们是包含数字0-9(有时甚至更多!)的字符串,因此您应该将它们视为字符串.VARCHAR(20)应该足够了.

请注意,如果您将电话号码存储为整数,许多系统将假设以0开头的数字是八进制(基数为8)!因此,完全有效的电话号码"0731602412"将以十进制数"124192010"进入您的数据库!


Hol*_*ger 5

任意表 ID

使用:INT(11)

MySQL 索引将能够最快地解析 int 列表。

一切安全

使用:BINARY(x)、 或BLOB(x)

您可以将安全令牌等以十六进制形式直接存储在 BINARY(x) 或 BLOB(x) 中。要从binary-type 检索,请使用SELECT HEX(field)...SELECT ... WHERE field = UNHEX("ABCD....")

任何日期

使用:DATETIMEDATE、 或TIME

DATETIME如果您需要存储日期和时间(而不是一对字段),请始终使用,因为DATETIME索引更适合 MySQL 中的日期比较。

任何真假

使用:(BIT(1)仅限 MySQL 8。)否则,使用BOOLEAN(1).

BOOLEAN实际上只是 的别名TINYINT(1),它实际上存储 0 到 255(不完全是 true/false,是吗?)。

任何你想要调用 `SUM()`、`MAX()` 或类似函数的东西

使用:INT(11)

VARCHAR 或其他类型的字段不能与SUM()等函数一起使用。

超过 1,000 个字符的任何内容

使用:文本。

最大限制为 65,535。

任何超过 65,535 个字符的内容

使用:中等文本。

最大限制为 16,777,215。

任何超过 16,777,215 个字符的内容

使用:长文本。

最大限制为 4,294,967,295。

名字、姓氏

使用 :VARCHAR(255)

UTF-8 字符每个可见字符可以占用三个字符,并且某些文化不区分名字和姓氏。此外,不同文化对于哪个名字在前、哪个名字在后可能存在分歧。您应该将这些字段命名为Person.GivenNamePerson.FamilyName

电子邮件地址

使用 :VARCHAR(256)

电子邮件路径的定义在1982 年的RFC821中设定。电子邮件的最大限制在 2001 年的RFC2821中设定,并且这些限制在 2008 年的RFC5321中保持不变。(参见第 4.5.3.1 节)大小限制和最小值。) 2004 年发布的RFC3696错误地将电子邮件地址限制引用为320字符,但这是一个“仅供参考”的 RFC,根据其简介明确“未定义任何标准”,因此请忽略它。

电话

使用:VARCHAR(255)

您永远不知道电话号码何时会采用“1800...”、“1-800”或“1-(800)”的形式,或者是否以“ext.42”或“ext.42”结尾。找苏珊”。

邮政编码

使用:VARCHAR(10)

您将获得类似12345或 的数据12345-6789。使用验证来清理此输入。

网址

使用:VARCHAR(2000)

官方标准支持的 URL 比这长得多,但很少有现代浏览器支持超过 2,000 个字符的 URL。请参阅这个答案:What is the Maximum length of a URL in different browsers?

价格

使用:DECIMAL(11,2)

它上升到11。