Mysql字段格式

TIMESTAMP和DATETIME

TIMESTAMP和DATETIME类型非常相似,显示出来都是YYYY-MM-DD hh:mm:ss[.小数]。不同点在于,timestamp保存时是保存的utc时间,获取时,会根据当前会话时区或者系统时区进行转化;DATETIME是一个绝对值,不会随时区变化。另外这两者在表达范围和存储占用也稍有不同。

datetime和timestamp都支持6位小数。

表达范围

TIMESTAMP只能表示’1970-01-01 00:00:01′ UTC 到’2038-01-19 03:14:07′ UTC;DATETIME可以表达的范围是 ‘1000-01-01 00:00:00’ 到 ‘9999-12-31 23:59:59’(注意这里没有时区)

Zero Value

当遇到非法的值时,都会转成Zero Value,即 ‘0000-00-00 00:00:00’

SQL语句示例

`ts` TIMESTAMP(6) NULL DEFAULT NULL

以上SQL中(6)表示该字段包含6位小数,即可精确到微秒(10^-6)。

存储差异

type 5.6.4之前 5.6.4以后
DATETIME 8 bytes 5 bytes + 小数部分
TIMESTAMP 4 bytes 4 bytes + 小数部分

小数部分存储:

小数长度 存储
0 0 bytes
1, 2 1 byte
3, 4 2 bytes
5, 6 3 bytes

因此在 MySQL5.6.4以后,DATETIME最少占5个字节,最多占8个字节;TIMESTAMP最少占4个字节,最多占7个字节。

参考资料

  1. https://stackoverflow.com/questions/2012589/php-mysql-year-2038-bug-what-is-it-how-to-solve-it
  2. https://dev.mysql.com/doc/refman/5.7/en/date-and-time-types.html

INT类型

INT(11) 和 INT(3) 没有任何区别,在存储上都占 4 bytes,只有当指定ZEROFILL时,才会体现出稍微的显示上的区别出来:

`id` INT(11) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT

以上语句指定了ZEROFILL,当保存一个文本长度不足11位的数字时,将会在数字前补充0,比如235,文本长度是3,因此追加8个0,显示出来时是00000000235。

navicate等GUI工具可能会把这些0去掉,导致没有显示差异。

即使指定了ZEROFILL,但不影响数字的存储,以及它们的计算,仅仅是显示上有差异而已。

修复symfony下swiftmail 无法发送邮件的问题

wpcraft项目中,本来是支持在部分情况下自动发送邮件的,但是今天测试一下发现好像不好使了,并且印象中好像没有修改到swiftmail的配置,甚至一度怀疑是smtp服务器把我的IP屏蔽了的缘故,但是后来试了一下phpmail却可以正常发送邮件,对比了一下,好像swiftmail默认的配置缺少点东西,于是按如下补上,修改app/config/parameters.yml

swiftmailer:
    transport: '%mailer_transport%'
    host: '%mailer_host%'
    username: '%mailer_user%'
    password: '%mailer_password%'
    port: '587'
    encryption: 'tls'
    spool: { type: memory }

添加了portencryption两个参数,结果一切正常,至于为什么突然要加这两项配置,我也挺纳闷…

做了一个极简的让wordpress支持markdown的插件,支持代码高亮

用过一些markdown的插件,要么就是用起来麻烦,要么就是写作体验差,于是只能手动撸一个了,安装后,写作时使用那个文本编辑器,直接写markdown的语法即可。

代码以及使用方法: https://github.com/yeskn-studio/markdown-one