2011-02-14 111 views
-1
CREATE TABLE IF NOT EXISTS `ci_sessions` (
session_id varchar(40) DEFAULT '0' NOT NULL, 
ip_address varchar(16) DEFAULT '0' NOT NULL, 
user_agent varchar(50) NOT NULL, 
last_activity int(10) unsigned DEFAULT 0 NOT NULL, 
user_data text DEFAULT '' NOT NULL, 
PRIMARY KEY (session_id) 
); 

现在,我有几个问题:笨奇怪的会话表

  1. 每个SESSION_ID为32个字符的长度,但在表中,我们有VARCHAR(40)。为什么varchar(40)而不是char(32)?

  2. 像182.111.112.113一样的ip_address长度为15个字符,但在表中我们有varchar(16)。为什么varchar(16)而不是varchar(15)?

  3. 每个user_agent的长度为50个字符,但在表中我们有varchar(50)。为什么varchar(50)而不是char(50)?

有人能回答我这个问题吗?请!

注意:我的默认存储引擎是InnoDB。

+0

代替改变的标题将其标记为[已解决],请单击其左侧的刻度以接受下面的答案之一。 – 2011-04-19 09:10:13

回答

0
  1. 他们可能选择使用40个字符,而不是32,正好有他们的背上覆盖的情况下,在未来的某个标准或改变他们修改它们编码id_session的方式。 varchar而不是char ......好吧,char在末尾添加空格(这是一个固定长度类型,http://dev.mysql.com/doc/refman/5.0/en/char.html),准确地适合40个字节。当您检索它时,它会回到32个字节,但我想他们使用Varchar来节省存储空间。

  2. 我不知道。抱歉!

  3. 也许使用varchar作为标准?我不知道,但在我的情况下,我倾向于有条不紊地使用varchar而不是char。

请记住,我所有的答案只是假设,我不清楚他们中的任何一个(特别是第二个xD)。

致以问候

+0

谢谢你的回答! – user557108 2011-02-17 18:18:22

+0

难道你不应该选择一个正确的答案吗?我知道要求标记是正确的是不礼貌的,但我认为如果你觉得你的答案被问到,你应该选择我们的答案之一。 – Korcholis 2011-02-19 00:01:20

1

根本不需要担心。采取措施,通过MySQL文档看看数据类型:

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

概括起来,VARCHAR扩展到什么是需要到指定的限制。所以如果你只使用50个字符,那么它只会在数据库中占用50个字符而不是60个。所以它可能只是需要非常偶数的开发人员。

0
  1. 可以将其更改为varchar(32)

  2. 为IPV6

  3. USER_AGENT是一个变种,因此改变为varchar(255)