将值插入检查约束 >0.00 的 DECIMAL 列会产生 SQL 错误 1292 截断不正确的 DOUBLE 值

Inserting value into DECIMAL column with check constraint >0.00 gives SQL error 1292 Truncated incorrect DOUBLE value

10.5.10-MariaDB

我有两个表,test1 和 test2。每个都有一个数据类型为 DECIMAL(5,2) 的列 'a_number'。 test1 具有约束 CHECK('a_number' > 0.00)。 test2 是 test1 的表副本,删除了检查约束。我在 1.23 的 test2 中添加了一个值。

当我运行下面的查询

    INSERT INTO test1 (a_number)
    SELECT a_number FROM test2;

我收到 SQL 错误 (1292) T运行 错误的 DOUBLE 值 'a_number'

| test1 | CREATE TABLE `test1` (
  `a_number` decimal(5,2) NOT NULL,
  CONSTRAINT `CC1` CHECK ('a_number' > 0.00)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
| test2 | CREATE TABLE `test2` (
  `a_number` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC |
SELECT * FROM test2;
+----------+
| a_number |
+----------+
|     1.23 |
+----------+

互联网搜索表明错误是由于比较不同的数据类型造成的。我尝试将 CAST 添加到 CHECK 中的文字以从字符串转换为十进制,但这没有效果。只是像一些帖子似乎建议的那样添加单引号也不起作用(错误消失但约束不起作用表明它现在将检查文字视为字符串)。

那是一个棘手的问题

您在检查约束中使用了单引号,因此 maradb 将文本 'a_namber' 与数字进行比较,从而导致错误消息

请仔细阅读以下话题When to use single quotes, double quotes, and backticks in MySQL

CREATE TABLE `test1` (
  `a_number` decimal(5,2) UNSIgNED NOT NULL,
  CONSTRAINT `CC1` CHECK (`a_number` > 0.00)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
CREATE TABLE `test2` (
  `a_number` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC
INSERT INTO test2 VALUES (1.1)
INSERT INTO test1 (a_number)
SELECT a_number FROM test2
SELECT * FROM test1
| a_number |
| -------: |
|     1.10 |

db<>fiddle here