MySQL TEXT或BLOB类型不能是唯一的吗?

问题描述:

我有一个表指定用户,这里是它的架构:MySQL TEXT或BLOB类型不能是唯一的吗?

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类型的colunm,但我该怎么做?或者使用TEXT或BLOB作为UNIQUE的任何方式?

+0

'publickey'必须是唯一的,可以是'null'? ;)尽管如此,真正的错误可以在https://*.com/questions/1827063/mysql-error-key-specification-without-a-key-length – GuyT

你在“钥匙”与“主钥匙”混淆。在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根据字节提出限制,这意味着字符编码会影响最大字符数(100是安全的)。