2017-08-11 55 views

回答

7

您正在專注於錯誤的行。在BLOBTEXT

name TEXT UNIQUE NOT NULL, 

索引必須是前綴索引,因此,它不可能強加給一個TEXTUNIQUE約束。您也不能使主鍵或外鍵約束的列成爲這樣的一部分。

兩個常見的解決方案:

  1. 不要使用TEXT列,使用VARCHAR

  2. 如果你真的需要很長的列是唯一的,創建CHAR類型,COLLATE ascii_bin的第二列中添加一個唯一約束它,並調整其大小適當的選擇密碼散列的Base64表示(MD5,SHA )。使用BEFORE INSERTBEFORE UPDATE觸發器強制此列包含長列的散列,因此間接強制實施唯一性。數據類型CHAR,因爲所有散列長度相同,並且ascii_bin,因爲這是base64最適合的排序規則。爲什麼base64?這是存儲空間的可讀性折衷方案,使用24個字符來存儲md5散列,該散列大約在二進制(md5的16個字符,高效)和十六進制(md5的32個字符,效率低下)之間的一半之間。

+0

VARCHAR如何支持國際語言? –

+0

據我所知,沒有區別。字符集和列的排序規則決定了這一點,而不是數據類型。如果您使用默認的'latin1',那麼國際支持幾乎不存在。請參閱['utf8mb4'](https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html)。 –

+0

對於文本/ blob我讀了一些地方,你可以使第一個x字符作爲索引,這就是爲什麼我有'INDEX(name(20))'。我的鏈接甚至演示了這一點 –

0

我發現了錯誤。您未指定長度屬性名稱。使用varchar(長度)而不是TEXT,其中長度是一個數字。

CREATE TABLE company ( id INT UNSIGNED PRIMARY KEY NOT NULL AUTO_INCREMENT,
name varchar(50) UNIQUE NOT NULL,
INDEX(name(20))
);

可以在VARCHAR()給予任何價值,但它應該是整數

所以,如果你想的最多50個字母的名稱代碼會。