今天领导叫我,给其他的领导开几个账号。但由于我们内网数据库的公网IP再也不开放,navicat再也用不了,那么俺只能冲向服务器去敲命令行。
群里俺的俩领导都等着,等着把领导的用户信息输入数据库。
然而当我自以为五分钟搞定,肯定能五分钟成功,啪啪啪瞬间敲下:
INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)
再填充这些values,敲出领导们的账号密码,密码该改MD5的MD5。
再把自以为在word里写得万无一失的命令复制粘贴进服务器的命令行里。
…
…
点下回车,Mysql竟然!!报错了!!!!!!:
(领导的名字我马赛克了我还想活)
报错如下:
ERROR 1054(42S22): unknow column '插入的值’ in 'field list’
我:???这是什么错(后面深夜才回想起来,是自己在写值时,忘记加上单引号的时候,报过这个错)
navicat用得多了,表格里直接填就很爽。而之前用命令行也是大多调整表的属性,所以这我第一次正儿八经用命令行插入表数据。我真的菜。
于是紧张刺激之中,我一边安慰自己能搞定。Mysql 不能再 easy了,我可以的,一边求助万能的百度。
一百度,有人说是列名的编码错了,不是utf-8。
我一看,报错的那个值,领导的名字是中文的,有可能啊。
于是连忙赶去查看,其实我已经看过一万次的最初的建表语句,以为是最近表属性被谁改了:
一查,就是utf-8啊,没改啊嘤嘤嘤
领导们都在等着要账号密码,好紧张刺激。
赶紧接着搜,发现有人说是自己在列名前面无意中加了个空格,所以报了这个错。
我心想,那我这报错的可是值啊,是领导的名字,不是列名。所以还是输入的值有问题吗?
又仔细看了看自己的各种空格,没错啊。于是我又试了试,一行命令,只插入一列的值。又试了试,将INSERT换成UPDATE方法。
而这些尝试,全都报:
ERROR 1054(42S22): unknow column '插入的第一个值’ in 'field list’
…
实在没辙了,百度下面也没啥有用信息。
我心想,那跑去navicat上面试一下看看会有没有不同的error log,死马当活马医吧。
(虽然这个想法是我活在梦里,但navicat的确解决了这个问题)
一换navicat,我自己怕之前哪里写错了,又敲一遍命令行。
幸亏我又敲了一遍!!!!
因为我发现,navicat里打出来的单引号和word里面打出来的单引号不一样!!!
navicat里面的单引号是直的单引号!!!!
它长这样:
word里的单引号是斜的!!!
它长这样:
我发誓这真的是【同一种】【英文的】输入法。但是word里敲出来复制进命令行就是和命令行、navicat直接敲出来的单引号长得不一样。
同样的,把他们复制去Mysql命令行里,他们也长得不一样!
我把领导名字截掉了,请注意看左右两边俺用红线标出来的单引号。
换成直的单引号后,就很轻松地插入成功了。
**
**
所以综上:
**
**
1.Mysql中,输入的单引号一定需要是直的单引号 (navicat敲,命令行里直接敲都是正确的,但如果从word里面复制就有可能会出现斜的双引号)
这是微软害我(不是
**
**
2.如果出现 ERROR 1054(42S22): unknow column 'xxxx’ in ‘field list’ 一定是xxxx的位置上哪里输入错误了。有可能是输入值或者列名的格式错误(像我的错误一样),也有可能是数据库里根本没有这个你输入的命令行里中报错的,叫xxxx的这个列名的这个列(别的博主那里看到的问题)。
**
紧张刺激过后remind一下。
现在回过头去看博客发的第一张报错的图,其实也能看到图里,(我在下面用红色标出来的位置),领导名字两边这里,是有两对诡异的引号。
其实最开始Mysql的报错就给了提示,但那时候可能因为我窗口开得太小,完全没有留意到这里有两对引号。
这个错误真的太菜了。还好最后把建的两个账号在20分钟左右发过去了。
特别不好意思解释,为啥自己建个账号也会这么慢。
那么又想了想,已知数据库设定utf-8编码,word应该是unicode字符集格式。(utf8是对unicode字符集进行编码的一种编码方式。)
那么我把命令从word复制过去服务器端命令行后,应该是保留了unicode字符集格式,所以被设为utf-8编码格式的数据库自然是容易产生插入问题。
而他们占用的字节数都是完全不一样的
溜了溜了