在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 字符串。