我需要编写一些跨供应商 SQL 查询,并且我想隐藏某些在上下文中不太重要的细节。
也就是说,我想围绕 MySQL 函数
checksum()
创建一个名为 crc32()
的包装器。它只会将其参数传递给 crc32()
并返回后一个函数的结果。
mysql> select crc32('foobar');
+-----------------+
| crc32('foobar') |
+-----------------+
| 2666930069 |
+-----------------+
1 row in set (0.00 sec)
mysql> CREATE FUNCTION checksum(x TEXT) RETURNS BIGINT DETERMINISTIC
-> RETURN crc32(x);
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select checksum('foobar');
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 '('foobar')' at line 1
我不相信这是一个实际的语法错误。我怀疑类型不匹配,但我尝试了所有我能想到的类型(
VARCHAR(255)
代表x
、UNSIGNED INT
、LONG
等返回类型)。
我没有更多的想法,ChatGPT 4 也没有;)
我错过了什么?
mysql> SHOW WARNINGS;
+-------+------+-----------------------------------------------------------------+
| Level | Code | Message |
+-------+------+-----------------------------------------------------------------+
| Note | 1585 | This function 'checksum' has the same name as a native function |
+-------+------+-----------------------------------------------------------------+
1 row in set (0.00 sec)
它可以与另一个名称一起使用。算了!
MySQL 已经有了名称校验和,所以你需要重命名你的函数
select crc32('foobar');
crc32('foobar') |
---|
2666930069 |
CREATE FUNCTION checksum_v(x TEXT)
RETURNS BIGINT
DETERMINISTIC
BEGIN
RETURN crc32(x);
END;
select checksum_v('foobar');
checksum_v('foobar') |
---|
2666930069 |