나에게 버그처럼 보이며이 수수께끼 같은 행동을 확인할 수 있습니다.
10.2.14-MariaDB
가능하면 정수 값을 두 배로 캐스트 할 수 있습니다.
SELECT cast(20 as double) UNION SELECT null UNION SELECT 2.2;
또는 이중 값이 먼저 있는지 확인하십시오.
SELECT 2.2 UNION SELECT null UNION SELECT 22;
@Evan Carroll의 답변에서 주석을 읽은 후 추가 관찰
select 20 union select null union select 2;
+------+
| 20 |
+------+
| 20 |
| NULL |
| 2 |
+------+
좋아, int 값을 사용하면 오류가 발생하지 않는 것 같습니다.
select 20 union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
오류 : 출력이 10 진수 (2,1) 인 것 같습니다
create table tmp as select * from (select 20 as x
union
select null
union
select 9.0) as t
describe tmp;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| x | decimal(2,1) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
오류는 명령 행 인터페이스와 분리되지 않으며 python2-mysql-1.3.12-1.fc27.x86_64에도 존재합니다.
>>> import MySQLdb
>>> db = MySQLdb.connect(host="localhost", user="*****", passwd="*****", db="test")
>>> cur = db.cursor()
>>> cur.execute("SELECT 20 union select null union select 2.2")
3L
>>> for row in cur.fetchall() :
... print row
...
(Decimal('9.9'),)
(None,)
(Decimal('2.2'),)
이상하게도 null이 처음 또는 마지막으로 이동하면 오류가 사라집니다.
select null union select 20 union select 9.0;
select 20 union select 9.0 union select null;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
널이 먼저 배치되면 결과 유형은 decimal (20,1)입니다. 널이 마지막으로 배치되면 결과 유형은 decimal (3,1)입니다
다른 레그가 유니온에 추가되면 오류가 사라집니다.
select 20 union select 6 union select null union select 9.0;
+------+
| 20 |
+------+
| 20.0 |
| 6.0 |
| NULL |
| 9.0 |
+------+
결과 유형 10 진수 (20,1)
중간에 다른 null을 추가하면 오류가 유지됩니다.
select 20 union select null union select null union select 9.0;
+------+
| 20 |
+------+
| 9.9 |
| NULL |
| 9.0 |
+------+
그러나 처음에 null을 추가하면 문제가 해결됩니다.
select null union select 20 union select null union select null union select 9.0;
+------+
| NULL |
+------+
| NULL |
| 20.0 |
| 9.0 |
+------+
예상대로 첫 번째 값을 decimal (3,1)로 캐스팅하면 작동합니다.
마지막으로 decimal (2,1)로 명시 적으로 캐스팅하면 동일한 오류가 발생하지만 경고가 표시됩니다.
select cast(20 as decimal(2,1));
+--------------------------+
| cast(20 as decimal(2,1)) |
+--------------------------+
| 9.9 |
+--------------------------+
1 row in set, 1 warning (0.00 sec)