我在MySQL中声明了以下表:
CREATE TABLE IF NOT EXISTS `ci_sessions` (
`session_id` varchar(40) COLLATE utf8_bin NOT NULL DEFAULT '0',
`ip_address` varchar(16) COLLATE utf8_bin NOT NULL DEFAULT '0',
`user_agent` varchar(150) COLLATE utf8_bin NOT NULL,
`last_activity` int(10) unsigned NOT NULL DEFAULT '0',
`user_data` text COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`session_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
假设我的数据库已经在使用UTF-8编码,那么postgres中表的等价定义是什么?
答案 0 :(得分:3)
CREATE TABLE ci_sessions (
session_id varchar(40) NOT NULL DEFAULT '0',
ip_address varchar(16) NOT NULL DEFAULT '0',
user_agent varchar(150) NOT NULL,
last_activity int4 NOT NULL DEFAULT '0',
user_data text NOT NULL,
PRIMARY KEY (session_id)
);
修改器IF NOT EXISTS已将IMHO添加到最新的PostgreSQL版本之一。
编辑:作为未命名的马推荐,我将第4个属性从decimal(10)更改为int4。但我也喜欢这里的时间戳(0)。如果你在这里需要微秒精度,那么只使用没有(0)的时间戳。
答案 1 :(得分:1)
除了丹尼尔已经说过的话:
如果您需要查询IP地址,最好使用本机inet数据类型:
http://www.postgresql.org/docs/current/static/datatype-net-types.html
列名last_activity建议使用时间戳列或类似内容。我强烈建议使用timestamp
数据类型。
如果它不同,那么integer
与MySQL int(10)
的匹配比小数更好。
请注意,MySQL中的int(10)确实不定义了值范围,它只是一个显示目的的提示!