我在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
答案 0 :(得分:1)
BIGINT
和BIGINT UNSIGNED
不一样。除非显式无符号,否则所有整数数据类型都将被签名。
但是,UUID_SHORT()
的目的是产生唯一但不随机,不可预测且总是递增的值,这对盐来说似乎是一个特别糟糕的选择,不是吗?
...特别是因为5.6.17中引入了RANDOM_BYTES()
功能。
http://dev.mysql.com/doc/refman/5.6/en/encryption-functions.html#function_random-bytes