MySQL UUID_SHORT()为列提供了超出范围值的错误

时间:2014-06-20 09:53:41

标签: mysql uuid bigint

我在Amazon Web Services RDS上使用MySQL 5.6.17并且在调用SELECT UUID_SHORT()时,我得到的数字大于 9223372036854775807 。例如,我得到的数字是

  

12057145185130250250

问题出在我的表中我有一个列为BIGINT(20)无符号,但是当存储一个数字 12057145185130250250 时我得到错误MySQL 22003

  

'MySQL 22003第1行''列''超出范围值

如果我在MySQL 5.6.11(在Windows 2008 64x上运行)的测试服务器上运行SELECT UUID_SHORT(),结果如下;

  

23526798209843216

我更改了我想要保存我的号码的列,因为BIGINT(20)未签名,但仍然出现此错误。

任何想法为什么?

更新

在我的初始帖子之后,我发现如果我使用Workbench编辑器手动将值'12057145185130250250'插入BIGINT(20)列,它会保存得很好。

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

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

1 个答案:

答案 0 :(得分:1)

BIGINTBIGINT UNSIGNED不一样。除非显式无符号,否则所有整数数据类型都将被签名。

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

...特别是因为5.6.17中引入了RANDOM_BYTES()功能。

http://dev.mysql.com/doc/refman/5.6/en/encryption-functions.html#function_random-bytes