在MySQL中存储随机数据(直接在table中)
Storing Random Data in MySQL (directly in table)
在 Python 脚本中,我正在使用由来自 os.urandom 的数据组成的盐生成 scrypt 哈希,我想将它们保存在 MySQL table。如果我尝试使用我见过的用于在数据库中有效存储散列的标准方法,使用 CHAR 列,我会得到散列和盐的 "Incorrect string value:" 错误。我能够找到的唯一允许随机数据的数据类型是 blob,但由于 blob 存储在 table 之外,因此它们存在明显的效率问题。
正确的做法是什么?在将数据插入数据库之前,我是否应该对数据做些什么以使其被 CHAR 接受?是否有另一种 MySQL 数据类型更适合这个?
编辑:
有人要代码,所以,当我这样做时:
salt = os.urandom(255)
hash = scrypt.hash(password,salt,1<<15,8,1,255)
cursor.execute("INSERT INTO users (email,hash,salt) values (%s,%s,%s)", [email,hash,salt])
MySQL 在我尝试插入这些值时出现 "Incorrect string value" 错误。
编辑 2:
根据 Joran 的要求,这里是不喜欢这样的架构:
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(254) NOT NULL DEFAULT '',
`hash` char(255) NOT NULL,
`salt` char(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
您的散列是一个二进制值,如果将其解释为字符串,很可能会包含 "unprintable characters"。要存储任意二进制数据,请使用 the BINARY or VARBINARY 数据类型。
如果必须使用字符串数据类型,可以使用base64 encoding将任意数据转换为 ASCII 字符串。
在 Python 脚本中,我正在使用由来自 os.urandom 的数据组成的盐生成 scrypt 哈希,我想将它们保存在 MySQL table。如果我尝试使用我见过的用于在数据库中有效存储散列的标准方法,使用 CHAR 列,我会得到散列和盐的 "Incorrect string value:" 错误。我能够找到的唯一允许随机数据的数据类型是 blob,但由于 blob 存储在 table 之外,因此它们存在明显的效率问题。
正确的做法是什么?在将数据插入数据库之前,我是否应该对数据做些什么以使其被 CHAR 接受?是否有另一种 MySQL 数据类型更适合这个?
编辑:
有人要代码,所以,当我这样做时:
salt = os.urandom(255)
hash = scrypt.hash(password,salt,1<<15,8,1,255)
cursor.execute("INSERT INTO users (email,hash,salt) values (%s,%s,%s)", [email,hash,salt])
MySQL 在我尝试插入这些值时出现 "Incorrect string value" 错误。
编辑 2:
根据 Joran 的要求,这里是不喜欢这样的架构:
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`email` varchar(254) NOT NULL DEFAULT '',
`hash` char(255) NOT NULL,
`salt` char(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
您的散列是一个二进制值,如果将其解释为字符串,很可能会包含 "unprintable characters"。要存储任意二进制数据,请使用 the BINARY or VARBINARY 数据类型。
如果必须使用字符串数据类型,可以使用base64 encoding将任意数据转换为 ASCII 字符串。