我们准备玩点有趣的:

select 一个数字:

mysql> select 1 from mysql.user;
+---+
| 1 |
+---+
| 1 |
| 1 |
| 1 |
+---+
3 rows in set (0.00 sec) mysql>

select 一个字符串:

mysql> select 'perl6' from mysql.user;
+-------+
| perl6 |
+-------+
| perl6 |
| perl6 |
| perl6 |
+-------+
3 rows in set (0.00 sec) mysql>

这个字符串单/双引号是一样的, 我们可以去掉空格:

mysql> select'perl6'from mysql.user;
+-------+
| perl6 |
+-------+
| perl6 |
| perl6 |
| perl6 |
+-------+
3 rows in set (0.00 sec) mysql>

可以看到正常执行。

那数字行不行呢?

mysql> select888from mysql.user;
ERROR 1064 (42000): 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 'select888from mysql.user' at line 1
mysql>

不行, 那我们再select一个浮点型看看:

mysql> select 0.8 from mysql.user;
+-----+
| 0.8 |
+-----+
| 0.8 |
| 0.8 |
| 0.8 |
+-----+
3 rows in set (0.00 sec) mysql>

小数点前后如果是0, 可以不写:

mysql> select 1. from mysql.user;
+----+
| 1. |
+----+
| 1 |
| 1 |
| 1 |
+----+
3 rows in set (0.00 sec) mysql> select .6 from mysql.user;
+-----+
| .6 |
+-----+
| 0.6 |
| 0.6 |
| 0.6 |
+-----+
3 rows in set (0.00 sec) mysql>

如果是浮点型的话, 我们就可以让这个数字跟后面的关链字连在一起了:

mysql> select.6 from mysql.user;
ERROR 1064 (42000): 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 'select.6 from mysql.user' at line 1
mysql> select .6from mysql.user;
+-----+
| .6 |
+-----+
| 0.6 |
| 0.6 |
| 0.6 |
+-----+
3 rows in set (0.00 sec) mysql>

.0就相当于0.0了, 可以这样写:

mysql> select 0.0 from mysql.user;
+-----+
| 0.0 |
+-----+
| 0.0 |
| 0.0 |
| 0.0 |
+-----+
3 rows in set (0.00 sec) mysql> select .0from mysql.user;
+-----+
| .0 |
+-----+
| 0.0 |
| 0.0 |
| 0.0 |
+-----+
3 rows in set (0.00 sec) mysql>

很好玩吧。

我们再看看别名:

mysql> select 'perl6' as P from mysql.user;
+-------+
| P |
+-------+
| perl6 |
| perl6 |
| perl6 |
+-------+
3 rows in set (0.00 sec) mysql>

as可省略:

mysql> select 'perl6'  P from mysql.user;
+-------+
| P |
+-------+
| perl6 |
| perl6 |
| perl6 |
+-------+
3 rows in set (0.00 sec) mysql>

省略后可写在一起:

mysql> select'perl6'P from mysql.user;
+-------+
| P |
+-------+
| perl6 |
| perl6 |
| perl6 |
+-------+
3 rows in set (0.01 sec) mysql>

那数字能不能起别名呢?也可以:

mysql> select 1 as 'perl6' from mysql.user;
+-------+
| perl6 |
+-------+
| 1 |
| 1 |
| 1 |
+-------+
3 rows in set (0.00 sec) mysql>

结合前面的浮点型与省略as, 可以这样写:

mysql> select .0'perl6'from mysql.user;
+-------+
| perl6 |
+-------+
| 0.0 |
| 0.0 |
| 0.0 |
+-------+
3 rows in set (0.00 sec) mysql>

我们用union select 再看看:

mysql> select .0from mysql.user union select .01;
+------+
| .0 |
+------+
| 0.00 |
| 0.01 |
+------+
2 rows in set (0.00 sec) mysql>

加个条件:

mysql> select .0from mysql.user where user='root' union select .01;
+------+
| .0 |
+------+
| 0.00 |
| 0.01 |
+------+
2 rows in set (0.00 sec) mysql>

再改改:

mysql> select .0from mysql.user where 1. union select 'perl6';
+-------+
| .0 |
+-------+
| 0.0 |
| perl6 |
+-------+
2 rows in set (0.00 sec) mysql>

小数点数字可以跟后面关链字连起来的, 上面说了, 所以, 我们还可以这样:

mysql> select .0from mysql.user where .1union select'perl6';
+-------+
| .0 |
+-------+
| perl6 |
+-------+
1 row in set (0.00 sec) mysql>

0.开头的小数点会转化为整数, 都转为0。

除了where, 还有一个类似的, 叫做having:

mysql> select .0from mysql.user having .0union select'perl6';
+-------+
| .0 |
+-------+
| perl6 |
+-------+
1 row in set (0.00 sec) mysql>

where 跟having可以一起用:

mysql> select .0from mysql.user where .0 having 1 union select'perl6';
+-------+
| .0 |
+-------+
| perl6 |
+-------+
1 row in set (0.00 sec) mysql> select .0from mysql.user where 1.0 having 1 union select'perl6';
+-------+
| .0 |
+-------+
| 0.0 |
| perl6 |
+-------+
2 rows in set (0.00 sec) mysql>

where跟having一起时, 逻辑是从左到右, 先执行前面的where, 再执行后面的having。

但是having只能跟在where后面。

而且你也不能这么写: (select user from mysql.user where user='root' where user='root')

除了where/having类似外, 还有类似的:

union select 
union distinct select
union all select

最后我们来看一下字符串转换为数字:

mysql> select 'a'+1;
+-------+
| 'a'+1 |
+-------+
| 1 |
+-------+
1 row in set, 1 warning (0.00 sec) mysql>

'a'转换为0, 相加结果是1。

提示有警告, 可以用如下命令查看信息:

mysql> select 'a'+1;
+-------+
| 'a'+1 |
+-------+
| 1 |
+-------+
1 row in set, 1 warning (0.00 sec) mysql> show warnings;
+---------+------+---------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
+---------+------+---------------------------------------+
1 row in set (0.00 sec) mysql>

字符串会被转换为数字, 如果能转换, 就转换为相应的数字, 不能转换就转换为0

mysql> select '1a'+1;
+--------+
| '1a'+1 |
+--------+
| 2 |
+--------+
1 row in set, 1 warning (0.00 sec) mysql> select 'a1'+1;
+--------+
| 'a1'+1 |
+--------+
| 1 |
+--------+
1 row in set, 1 warning (0.02 sec) mysql> select ''+1;
+---------+
| ''+1 |
+---------+
| 124 |
+---------+
1 row in set (0.00 sec) mysql>

我们可以连着一起写:

mysql> select'per16'+.1'test';
+------+
| test |
+------+
| 0.1 |
+------+
1 row in set, 1 warning (0.00 sec) mysql>

最后再来看点好玩的:

mysql> select host from mysql.user;
+-----------+
| host |
+-----------+
| 127.0.0.1 |
| ::1 |
| localhost |
+-----------+
3 rows in set (0.00 sec) mysql> select host from mysql.user where password='a'+'a';
+-----------+
| host |
+-----------+
| localhost |
| 127.0.0.1 |
| ::1 |
+-----------+
3 rows in set, 5 warnings (0.00 sec) mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
| Warning | 1292 | Truncated incorrect DOUBLE value: 'a' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' |
| Warning | 1292 | Truncated incorrect DOUBLE value: '*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B' |
+---------+------+-------------------------------------------------------------------------------+
5 rows in set (0.00 sec) mysql>

password='a'+'a', 字符串'a'转换成数字(因为有个 + 号), 会发生警告信息, 信息中包含用户的密码。

password='a'+'a', 会被转化为整数类型的表达式, 像 2=1+1

看下面的例子:

mysql> select user();
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec) mysql> select user()+'';
+-----------+
| user()+'' |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec) mysql> select user()=''+'';
+--------------+
| user()=''+'' |
+--------------+
| 1 |
+--------------+
1 row in set (0.00 sec) mysql> select user()=''+'';
+---------------+
| user()=''+'' |
+---------------+
| 0 |
+---------------+
1 row in set (0.00 sec) mysql>

本身user()是字符串的, 遇到了左边的 两个字符串相加, 所以右边的user()也将会自动转换为数值类型。

mysql中的单引号/小数点/字符转换为数字/警告信息的更多相关文章

  1. 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||

    换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ...

  2. 关于Mysql查询带单引号及插入带单引号字符串问题

    1.转为带参数查询 String sql=""select id from student where name='?'; Connection connect = DriverM ...

  3. js、html中的单引号、双引号及其转义使用

    js.html中的单引号.双引号及其转义使用在js中对相关字符做判断或取值的时候很多情况下都会用到这些. ------ 在一个网页中的按钮,写onclick事件的处理代码,不小心写成如下:<in ...

  4. php中的单引号与双引号详解

    一.引号定义字符串 在Php中,通常一个字符串被定义在一对引号中,如: 'I am a string in single quotes'"I am a string in double qu ...

  5. JS 和 HTML 中的单引号与双引号

    JS中的单引号与双引号 HTML中的单引号与双引号很简单,就是两个字符实体: 显示 描述 实体名称 实体编号 " 双引号.引号 " " ' 单引号.撇号 &apo ...

  6. javaScript中的单引号与双引号

    javaScript中的单引号与双引号没有什么区别.但因为xhtml规范要求所有xhtml属性要用双引号括起来.所以在javaScript中使用单引号. var html = '<h2 clas ...

  7. mysql中实现行号,oracle中的rowid

    mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

  8. Oracle中的单引号问题

    SELECT '<a href="javascript:void(0)" onclick="openWyl('''||a.aac001 FROM ac01 a; S ...

  9. [转载]mysql中实现行号,oracle中的rowid

    mysql中实现行号需要用到MYSQL的变量,因为MySql木有rownumber. MYSQL中变量定义可以用 set @var=0 或 set @var:=0 可以用=或:=都可以,但是如果变量用 ...

随机推荐

  1. vue 开发多页应用

    vue 开发多页应用 https://www.cnblogs.com/fengyuqing/p/vue_cli_webpack.html https://segmentfault.com/a/1190 ...

  2. P1349 广义斐波那契数列

    题目描述 广义的斐波那契数列是指形如an=p*an-1+q*an-2的数列.今给定数列的两系数p和q,以及数列的最前两项a1和a2,另给出两个整数n和m,试求数列的第n项an除以m的余数. 输入输出格 ...

  3. java动态代理(JDK和CGLIB)笔记

    动态代理:为一堆interface或类的实现提供统一的执行通道,从含义上就像局域网电脑通过代理上网一样,走统一的通道,代理控制通道,自然可以在通道里加上自定义实现,例如像AOP切面,日志等. JDK的 ...

  4. bzoj 1037: [ZJOI2008]生日聚会Party (dp)

    dp,但是要顺推容易点 const mm=; var f:..,..,..,..]of longint; n,m,kk,now,sum,i,j,k1,k2:longint; function max( ...

  5. AOJ.综合训练.2016-12-1

    友情提示:不要复制粘贴,看完解析先自己尝试写一下,不行再看代码!祝AC愉快 @_@ A. 近似值计算 题意分析 根据公式,先用含有n的代数式表示出来pi,然后计算这个近似值和题目给出来的3.14159 ...

  6. 【贪心】【CF3D】 Least Cost Bracket Sequence

    传送门 Description 给一个序列,序列里面会有左括号.问号.右括号.对于一个\(?\)而言,可以将其替换为一个\((\),也可以替换成一个\()\),但是都有相应的代价.问:如何替换使得代价 ...

  7. C/C++中字符串与数字相互转换

    数字转字符串: 用C++的streanstream: #include <sstream> #Include <string> string num2str(double i) ...

  8. mybaties分页

    首先引入jar包: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId> ...

  9. Indexing GROUP BY

    SQL databases use two entirely different group by algorithms. The first one, the hash algorithm, agg ...

  10. Makefile中的 =,:=,?=,+= 的差异

    在Makefile中常常遇见这几种等操作,总结一下具体区别. =  是最基本的赋值 :=  是用右值覆盖左值 ?=  判断,如果左值没有被赋值过就赋以右值,否则,不做赋值动作 += 在左值后面连接右值 ...