我在 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) 无符号,但仍然收到此错误。
有什么想法吗?
更新
继我最初的帖子之后,我发现如果我使用工作台编辑器手动将值“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
Run Code Online (Sandbox Code Playgroud)
BIGINT并且BIGINT UNSIGNED不一样。除非明确无符号,否则所有整数数据类型都是有符号的。
而且,UUID_SHORT()它的设计目的是产生独特但非随机、不可预测且始终递增的值,这对于盐来说似乎是一个特别糟糕的选择,不是吗?
...特别是自从该RANDOM_BYTES()功能在 5.6.17 中引入以来。
http://dev.mysql.com/doc/refman/5.6/en/encryption-functions.html#function_random-bytes