首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL UUID_SHORT()给出列超出范围值的错误

问MySQL UUID_SHORT()给出列超出范围值的错误
EN

Stack Overflow用户
提问于 2014-06-20 09:53:41
回答 1查看 1.6K关注 0票数 4

我在上使用MySQL 5.6.17,当调用SELECT UUID_SHORT()时,我得到的数字比MySQL大例如,我得到的数字是

12057145185130250250

问题是在我的表中,我有一个列BIGINT(20)没有签名,但是当存储一个数字12057145185130250250时,我得到了错误MySQL 22003

'MySQL 22003超出列‘在第1行’的范围值‘

如果在我们的测试服务器上运行SELECT UUID_SHORT(),即MySQL 5.6.11 (运行在Windows200864x上),结果如下;

23526798209843216

我将试图保存编号的列更改为BIGINT(20)未签名,但仍然会得到此错误。

知道为什么吗?

更新

在我最初的文章中,我发现如果我使用Workbench编辑器将值'12057145185130250250‘手动插入到BIGINT(20)列中,它会保存得很好。

但是,如果我使用像下面这样的存储过程保存值,那么当我遇到问题时;

代码语言:javascript
复制
DELIMITER $$

CREATE DEFINER=`testaccount`@`%` PROCEDURE `CreateCustomer`(iUserId
INTEGER, sPassword VARCHAR(75)) 

BEGIN

    DECLARE iSalt BIGINT;

    SELECT UUID_SHORT() INTO iSalt;

    INSERT INTO UserCustomer
    (
       UserId,
       Password,
       Salt
    )
    VALUES
    (
       iUserId,
       SHA2(CONCAT(iSalt,sPassword), 256),
       iSalt 
    );

END
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-20 12:23:09

BIGINT和BIGINT UNSIGNED不一样。除非显式无符号,否则所有整数数据类型都有符号。

而且,UUID_SHORT()的设计目的是产生唯一的但不是随机的,不是不可预测的,而且总是增加值,这对于盐来说似乎是一个特别糟糕的选择,不是吗?

...Especially自5.6.17引入RANDOM_BYTES()函数以来。

random-bytes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24324548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档