LightDB 从23.4开始支持mysql 的cast(expr as unsigned) 语法,下面说明下不兼容的注意点及示例
lightdb@test_m=# select cast(123 as unsigned) as unsigned;
unsigned
----------
123
(1 row)
lightdb@test_m=# select cast(-123 as unsigned) as unsigned;
unsigned
----------------------
18446744073709551493
(1 row)
lightdb@test_m=# select cast(18446744073709551615 as unsigned) as unsigned;
unsigned
----------------------
18446744073709551615
(1 row)
lightdb@test_m=# select cast(18446744073709551616 as unsigned) as unsigned;
WARNING: unsigned bigint out of range, Truncated
unsigned
----------------------
18446744073709551615
(1 row)
lightdb@test_m=# select cast(-9223372036854775808 as unsigned) as unsigned;
unsigned
---------------------
9223372036854775808
(1 row)
-- mysql5.7为 0 ,mysql8.0: 9223372036854775808
lightdb@test_m=# select cast(-9223372036854775809 as unsigned) as unsigned;
WARNING: unsigned bigint out of range, Truncated
unsigned
---------------------
9223372036854775808
(1 row)
lightdb@test_m=# select cast(1.4 as unsigned) as unsigned;
unsigned
----------
1
(1 row)
lightdb@test_m=# select cast(1.5 as unsigned) as unsigned;
unsigned
----------
2
(1 row)
lightdb@test_m=# select cast(1.9 as unsigned) as unsigned;
unsigned
----------
2
(1 row)
-- mysql5.7为 0 ,mysql8.0: 18446744073709551614
lightdb@test_m=# select cast(-1.9 as unsigned) as unsigned;
unsigned
----------------------
18446744073709551614
(1 row)
-- mysql5.7为 0 ,mysql8.0: 18446744073709551614
lightdb@test_m=# select cast(-1.5 as unsigned) as unsigned;
unsigned
----------------------
18446744073709551614
(1 row)
-- mysql5.7为 0 ,mysql8.0: 18446744073709551615
lightdb@test_m=# select cast(-1.4 as unsigned) as unsigned;
unsigned
----------------------
18446744073709551615
(1 row)
-- mysql: 1
lightdb@test_m=# select cast('1.4' as unsigned) as unsigned;
unsigned
----------
1
(1 row)
-- mysql: 1
lightdb@test_m=# select cast('1.5' as unsigned) as unsigned;
unsigned
----------
2
(1 row)
-- mysql: 1
lightdb@test_m=# select cast('1.9' as unsigned) as unsigned;
unsigned
----------
2
(1 row)
-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.4' as unsigned) as unsigned;
unsigned
----------------------
18446744073709551615
(1 row)
-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.5' as unsigned) as unsigned;
unsigned
----------------------
18446744073709551614
(1 row)
-- mysql: 18446744073709551615
lightdb@test_m=# select cast('-1.9' as unsigned) as unsigned;
unsigned
----------------------
18446744073709551614
(1 row)
lightdb@test_m=# select cast(2e2 as unsigned) as unsigned;
unsigned
----------
200
(1 row)
-- mysql 为 2, 被截断
lightdb@test_m=# select cast('2e2' as unsigned) as unsigned;
unsigned
----------
200
(1 row)
lightdb@test_m=# create table test_c(key1 float4);
CREATE TABLE
lightdb@test_m=# insert into test_c values('-1.6');
INSERT 0 1
lightdb@test_m=# insert into test_c values('-1.4');
INSERT 0 1
lightdb@test_m=# insert into test_c values('-1.5');
INSERT 0 1
lightdb@test_m=# select cast(key1 as unsigned) , key1 from test_c;
numeric2unsigned | key1
----------------------+------
18446744073709551614 | -1.6
18446744073709551615 | -1.4
18446744073709551614 | -1.5
(3 rows)
lightdb@test_m=# select cast(cast('20121212' as date) as unsigned);
ERROR: cannot cast type date to numeric
LINE 1: select cast(cast('20121212' as date) as unsigned);
^
lightdb@test_m=#