同:都是按字符数存放。(varchar最多表示2个字节的内容,ascii就是65535个字符,UTF8是22000个左右)
不同:1, char 不够M格,就补空格
2,如果要在最后加空格,用char取出后丢失,varchar不会。
许多字符串数据类型的列定义可以包括指定字符集的CHARACTER SET属性,也可能包括校对规则。(CHARSET是CHARACTER SET的一个同义词)。这些属性适用于CHAR、VARCHAR、TEXT类型、ENUM和SET。例如:
· CREATE TABLE t
· (
· c1 CHAR(20) CHARACTER SET utf8,
· c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin
· );
(实际开发中,很少用日期时间类型来表示一个需要精确到秒的列。原因:不方便计算)
DATETIME、DATE和TIMESTAMP类型是相关的。该节描述了它们的特征,它们的相似点和不同点。
当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以'YYYY-MM-DD HH:MM:SS'格式检索和显示DATETIME值。支持的范围为'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。(“支持”表示尽管先前的值可能工作,但没有保证)。
当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用'YYYY-MM-DD'格式检索和显示DATE值。支持的范围是'1000-01-01'到 '9999-12-31'。
TIMESTAMP列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。这些属性将在本节后面描述。
1、 Year 类型,1个字节表示 1901-2155 【0000表示错误时选择】
如果输入2位,‘00-69’ 表示2000-2069. '70'-99 表示1970-1999
建议直接输入4位
create table myyear(nian year);
mysql> insert into myyear values(12); Query OK, 1 row affected mysql> select * from myyear; +------+ | nian | +------+ | 2012 | +------+ 1 row in set mysql> insert into myyear values(1888); Query OK, 1 row affected mysql> select * from myyear; +------+ | nian | +------+ | 2012 | | 0 | +------+ 2 rows in set mysql>
时间:
1、 Year 类型,1个字节表示 1901-2155 【0000表示错误时选择】
如果输入2位,‘00-69’ 表示2000-2069. '70'-99 表示1970-1999
建议直接输入4位
create table myyear(nian year);
mysql> insert into myyear values(12); Query OK, 1 row affected mysql> select * from myyear; +------+ | nian | +------+ | 2012 | +------+ 1 row in set mysql> insert into myyear values(1888); Query OK, 1 row affected mysql> select * from myyear; +------+ | nian | +------+ | 2012 | | 0 | +------+ 2 rows in set mysql>
MySQL以'HH:MM:SS'格式检索和显示TIME值(或对于大的小时值采用'HHH:MM:SS'格式)。TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。
你可以用各种格式指定TIME值:
· 'D HH:MM:SS.fraction'格式的字符串。还可以使用下面任何一种“非严格”语法:'HH:MM:SS.fraction'、'HH:MM:SS'、'HH:MM'、'D HH:MM:SS'、'D HH:MM'、'D HH'或'SS'。这里D表示日,可以取0到34之间的值。请注意MySQL还不保存分数。
· 'HHMMSS'格式的没有间割符的字符串,假定是有意义的时间。例如,'101112'被理解为'10:11:12',但'109712'是不合法的(它有一个没有意义的分钟部分),将变为'00:00:00'。
· HHMMSS格式的数值,假定是有意义的时间。例如,101112被理解为'10:11:12'。下面格式也可以理解:SS、MMSS、HHMMSS、HHMMSS.fraction。请注意MySQL还不保存分数。
· 函数返回的结果,其值适合TIME上下文,例如CURRENT_TIME。
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2013-01-31 14:55:36 | +---------------------+ 1 row in set mysql> select current_time(); +----------------+ | current_time() | +----------------+ | 14:55:50 | +----------------+ 1 row in set
对于指定为包括时间部分间割符的字符串的TIME值,如果时、分或者秒值小于10,则不需要指定两位数。'8:3:2'与'08:03:02'相同。
为TIME列分配简写值时应注意。没有冒号,MySQL解释值时假定最右边的两位表示秒。(MySQL解释TIME值为过去的时间而不是当天的时间)。例如,你可能认为'1112'和1112表示'11:12:00'(11点过12分),但MySQL将它们解释为'00:11:12'(11分,12 秒)。同样,'12'和12 被解释为 '00:00:12'。相反,TIME值中使用冒号则肯定被看作当天的时间。也就是说,'11:12'表示'11:12:00',而不是'00:11:12'。
超出TIME范围但合法的值被裁为范围最接近的端点。例如,'-850:00:00'和'850:00:00'被转换为'-838:59:59'和'838:59:59'。
无效TIME值被转换为'00:00:00'。请注意由于'00:00:00'本身是一个合法TIME值,只从表内保存的一个'00:00:00'值还不能说出原来的值是 '00:00:00'还是不合法的值。