围绕 CRC32 编写 MySQL 包装器

问题描述 投票:0回答:2

我需要编写一些跨供应商 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 user-defined-functions typing
2个回答
0
投票
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)

它可以与另一个名称一起使用。算了!


0
投票

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.