1、问题描述
Mysql 里面SQL语句空格、字符串问题,你发现不了,但是就是运行报错。不服?来我们上源码。先来看一个删除表的。
DROP TABLE IF EXISTS 'user';
堂堂正正删除表,没毛病,运行。
1 queries executed, 0 success, 1 errors, 0 warnings
查询:DROP TABLE IF EXISTS 'user'
错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''user'' at line 1
执行耗时 : 0 sec
传送时间 : 0 sec
总耗时 : 0 sec
什么鬼。这里user
不能用字符串的引号。只能用mysql
自带的引号。
DROP TABLE IF EXISTS `user`;
对比下这两种写法在SQLYog
中的效果。执行SQL语句。
1 queries executed, 1 success, 0 errors, 1 warnings
查询:DROP TABLE IF EXISTS `user`
共 0 行受到影响, 1 个警告
执行耗时 : 0 sec
传送时间 : 1.183 sec
总耗时 : 1.184 sec
注意:要查看所有警告的完整列表,请启用 工具 -> 首选项 -> 常规 -> 在信息选项卡下显示警告
再来个大招,关于空格的。
CREATE TABLE `role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
也是堂堂正正建立一个表。没毛病。执行SQL语句。
1 queries executed, 0 success, 1 errors, 0 warnings
查询:CREATE TABLE `role` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_bin NOT NULL...
错误代码: 1064
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TABLE `role` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`n' at line 1
执行耗时 : 0 sec
传送时间 : 0 sec
总耗时 : 0 sec
我的个亲娘嘞!还有没有王法。是的就是空格的问题。我们拿到记事本过滤一下再拷贝回来执行SQL语句。
CREATE TABLE role(
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) COLLATE utf8_bin NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
大家肉眼看看和上面有什么区别,看出来的话,你是我大哥,我水土不服舅服你。执行SQL语句。
1 queries executed, 1 success, 0 errors, 0 warnings
查询:CREATE TABLE role( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`id`) ) ...
共 0 行受到影响
执行耗时 : 0.027 sec
传送时间 : 1.171 sec
总耗时 : 1.199 sec
看似一毛一样,竟然执行成功了。我们来看看SQLyog
中两段代码的差别。
确实空格不同,颜色也不同。接下来看看Navicat
的,一毛一样,还是SQLyog
好啊。
遇到这样的问题想必各位会直接哭晕在厕所了。不说了,我刚刚醒。
2、总结
书上的代码直接运行绝大部分是对的,但是总有一些软件的更新使得作者无能为力。之前的API是对的,但是之后就废弃了或修改了是常有的事。所以我们需要跟踪源代码。这只是一个小小的问题,如果没有前辈的无私奉献,很难想象我们自己一天能学到多少内容。感谢各位前辈的辛勤付出,让我们少走了很多的弯路!
点个赞再走呗!欢迎留言哦!