Tag Archives

2 Articles

MySQL 的大小写敏感问题

昨晚刚刚被一个课程大作业坑了,特地写一篇博客来记录一下。提问: MySQL 是大小写敏感的么(包括关键字和标识符)?刚上过数据库系统原理课的好学生们一定会记得这句话:“ SQL 是大小写不敏感的”。而有过一些实际开发经验的人可能会说:“表名是大小写敏感的,其他不是。”很遗憾,两个答案都是错的。

Short version: it is implementation dependent.

对于 MySQL 来说,所有的关键字都遵循 SQL 标准,大小写不敏感,而表名是否敏感则依赖于一个叫做 lower_case_table_names 的设置项,它的默认值根据操作系统而不同,具体如下(文档):

  • Windows: 该值默认为1,表名在存储、查找过程中都被转化为小写,因而是完全大小写不敏感的。这与 Windows 的文件系统有关,事实上,你无法在一个大小写无关的文件系统上强制 MySQL 大小写敏感。
  • *nix: 该值默认为0,表名在存储、查找过程都严格遵照给定的大小写,即是完全敏感的。
  • Mac OSX: 该值默认为2,表名在存储时保留大小写,但在比对时全部转化为小写。这和 Mac OSX 的文件系统惯例一致。

所以,当我昨晚从(使用 Windows 的)队友手中接过一个数据库操作不在意大小写的代码时,虽然浑身不舒服,但回想起课上说过的“ SQL 大小写不敏感”(虽然我从没有试过非关键字究竟是不是大小写敏感的),就也没多想。可一跑起来却全是数据库错误,愣是过了好一会才终于怀疑起大小写的问题来……

MySQL binlog 与 Replication

经常听到有人问:“为什么我的 phpMyAdmin 提示:此 MySQL 服务器正以主服务器运行于复制进程中?明明我没有开启复制模式啊。”

这种情况的原因多半是开启了 binlog ,其实 binlog 也是一种 Replication ,即是把所有的 SQL 操作记录到了一个日志中。 binlog 的用途除了备份以外也可以用作“replay”。