2013-06-02 63 views
1

我有時會在我的應用程序日誌中出現以下錯誤插入到MySQL:「例外:SQLSTATE [23000]:完整性約束違規:1062重複項」錯誤的指數被截斷

2013/06/02 15:11:05 (Database) Exception: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa' for key 'hash_UNIQUE' 

的問題以上是被索引的值被截斷爲64個字符長,但實際列長度爲255個字符。該值的一個示例是:4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481d

表定義爲如下:

delimiter $$ 

CREATE TABLE `reset` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `identity_id` bigint(20) unsigned NOT NULL, 
    `hash` varchar(255) NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `upn` varchar(255) NOT NULL, 
    `returnurl` varchar(255) DEFAULT NULL, 
    `processed` char(1) DEFAULT 'N', 
    `referer` varchar(15) DEFAULT 'CPCUsociety.org', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `hash_UNIQUE` (`hash`), 
    KEY `reset_upn_ndx` (`upn`), 
    KEY `reset_hash_ndx` (`hash`), 
    KEY `reset_timestampndx` (`timestamp`), 
    KEY `idendity_id_for_key_idx` (`identity_id`), 
    CONSTRAINT `idendity_id_for_key` FOREIGN KEY (`identity_id`) REFERENCES `identity` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=585 DEFAULT CHARSET=utf8$$ 

我如何可以強制MySQL使用的全部價值爲指數?

回答

1

我試過你的代碼在我的本地環境和工作正常。我試過先插入這個查詢:

INSERT INTO `test`.`reset` 
    (`id`,`identity_id`,`hash`,`timestamp`,`upn`,`returnurl`,`processed`,`referer`) 
VALUES 
    (
    null, 1, '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481t', 
    null, 'a', null, null, null 
    ); 

哪個工作正常。然後我試着插入相同的查詢,並得到了同樣的錯誤,你:

Error Code: 1062. Duplicate entry '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa' for key 'hash_UNIQUE' 

好吧,這裏我已經改變了只在最後一個字符散列(B代替T),然後它工作得很好:

INSERT INTO `test`.`reset` 
    (`id`,`identity_id`,`hash`,`timestamp`,`upn`,`returnurl`,`processed`,`referer`) 
VALUES 
    (
    null, 1, '4d9acbacc6ed7dc2733025e4b8af7be4940fe5b70338789b34caea27695860fa2b497f6cd34851657c9d3e8e8e88713d80da1a22d8654cf98622e9af3f29481b', 
    null, 'a', null, null, null 
    ); 

這意味着MySQL使用UNIQUE索引的全部值,即使它只顯示錯誤報告中的部分散列值。

我找不到mysql不顯示整個字符串的原因,但是我相信你的問題肯定與解析器使用的部分索引無關。讓我知道你怎麼去。

+0

我的所有研究狀態都一樣。很多人都被這個奇怪的錯誤困擾着。但是我曾經在某處看到過一個bug報告,指出索引大小已經從32個增加到了64個字符。我想知道它是否可能與某些版本有關。但是當我有機會時,我會嘗試單獨測試。 – Salsero69

相關問題