【问题标题】:MySQL TEXT or BLOB type cannot be unique?MySQL TEXT 或 BLOB 类型不能唯一?
【发布时间】:2018-04-02 11:52:16
【问题描述】:

我有一个名为 users 的表,这是它的架构:

class User(db.Model):
__tablename__ = "Users"
id = db.Column(db.Integer, unique=True, primary_key=True)
firstname = db.Column(db.String(64), unique=False, nullable=False)
lastname = db.Column(db.String(64), unique=False, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(93), unique=False, nullable=False)
phone = db.Column(db.String(10), unique=True, nullable=False)
publickey = db.Column(db.Text, unique=True, nullable=True)
isitseller = db.Column(db.Boolean, unique=False, nullable=False)
money = db.Column(db.Float, unique=False, nullable=False)

def __init__(self, firstname, lastname, email, password, phone, publickey, isitseller):
    self.firstname = firstname
    self.lastname = lastname
    self.email = email
    self.password = generate_password_hash(password)
    self.phone = phone
    self.publickey = publickey
    self.isitseller = isitseller
    self.money = 0.00

def check_password(self, password):
    return check_password_hash(self.password, password)

def __repr__(self):
    return '<User %r>' % self.firstname + " " + self.lastname

但是当我尝试使用 db.create_all() 创建用户表时,它会输出我

(_mysql_exceptions.OperationalError) (1170, "BLOB/TEXT column 'publickey' used in key specification without a key length") [SQL: '
CREATE TABLE `Users` (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    firstname VARCHAR(64) NOT NULL, 
    lastname VARCHAR(64) NOT NULL, 
    email VARCHAR(120) NOT NULL, 
    password VARCHAR(93) NOT NULL, 
    phone VARCHAR(10) NOT NULL, 
    publickey TEXT, 
    isitseller BOOL NOT NULL, 
    money FLOAT NOT NULL, 
    PRIMARY KEY (id), 
    UNIQUE (id), 
    UNIQUE (email), 
    UNIQUE (phone), 
    UNIQUE (publickey), 
    CHECK (isitseller IN (0, 1))
)

']

据我了解,我需要使用 TEXT 或 BLOB 类型的列之外的任何内容,但我该怎么做呢?或以任何方式使用 TEXT 或 BLOB 作为 UNIQUE?

【问题讨论】:

标签: python mysql flask-sqlalchemy


【解决方案1】:

您将“键”与“主键”混淆了。在 MySQL 中,键只是在此上下文中引用索引。

我强烈建议您在字段中使用varchar(),而不是text——除非它真的很大。

无论如何,MySQL 对索引键的大小都有限制。而且,text 的大小不受限制。矛盾。这已解决 - 正如documentation 解释的那样 - 通过要求长度来解决:

对于 BLOB 和 TEXT 列的索引,您必须指定索引前缀 长度。对于 CHAR 和 VARCHAR,前缀长度是可选的。见章节 8.3.4,“列索引”。

不幸的是,这也意味着您不能将 text 列声明为唯一的,因为这需要索引。

我认为uniquecreate table 语句中不接受长度。您可以在前缀上定义唯一索引:

create unique index unq_users_ publickey on users(publickey(100));

注意最大长度。 MySQL根据bytes设置了一个限制,也就是说字符编码会影响最大字符数(100是安全的)。

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2012-03-07
    • 2011-10-27
    相关资源
    最近更新 更多