Conversione da 5.0.27 a 5.1.41, ottenendo gli errori di chiave duplicati (1062)
-
01-10-2019 - |
Domanda
Ho un database che è attualmente in esecuzione su un server 5.0.27. Voglio passare a un nuovo server 5.1.41.
I mysqldump'd tutti i file. Durante il ripristino, ottengo un errore
ERROR 1062 (23000) at line 21: Duplicate entry 'weiÃ' for key 'title'
ho ristretto il basso mancato questo script, che posso correre e viene a mancare:
--
-- Table structure for table `word`
--
set names utf8;
DROP TABLE IF EXISTS `word`;
CREATE TABLE `word`
(
`wordid` int (10) unsigned NOT NULL auto_increment,
`title` char (50) NOT NULL default '',
PRIMARY KEY (`wordid`),
UNIQUE KEY `title` (`title`)
) ENGINE=MyISAM AUTO_INCREMENT=280707 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
--
-- Dumping data for table `word`
--
LOCK TABLES `word` WRITE;
INSERT INTO `word` VALUES
(198036,'weis'),
(241473, unhex('776569C39F'));
UNLOCK TABLES;
Modifica -. Cambiato in UNHEX
ho controllato e ricontrollato tutte le variabili del set di caratteri e di collazione tra i due server, e sembrano identici. Anche se non lo fossero, sto specificando le regole di confronto me stesso.
Le eventuali indizi utili a capire quello che sto facendo male qui?
EDIT: ecco il comando che sto usando per il dump del database:
mysqldump --add-drop-table --add-locks --disable-keys --lock-tables --quick -uusername -ppassword database > filename
e al carico
mysql -D$MYSQL_DB -u$MYSQL_USER -p$MYSQL_PASSWD < filename
Come posso controllare le regole di confronto per le connessioni client?
Soluzione 2
Da un compagno su LiveJournal, ho scoperto che si tratta di un bug "fix" tra il 5.0 e 5.1: Hanno cambiato le regole di confronto. Se andate a leggere la segnalazione di bug, in realtà ha rotto è (Weis e weiss non dovrebbe essere equivalente). Ma non stanno andando a Unbreak esso. Quindi io sia necessario cambiare le regole di confronto (come suggerisce Dave Orr), o manualmente modificare i miei dati.
Altri suggerimenti
Il problema specifico è che in utf8_general_ci, 'weis' e 'weiß' sono equivalenti. Se si vuole 'weiß' essere uguale a 'weiss', allora dovreste usare utf8_unicode_ci. Che risolverà il problema sul lato delle importazioni (a meno che non si dispone di 'weiss' nel database, ma poi avete veramente un duplicato).
A occhio e croce, la tabella originale ha impostato utf8_unicode_ci, e non hai notato la differenza. Se questo non è vero, non ho idea di come il vostro tavolo ottenuto nello stato è in - ma il passaggio per la collazione destra dovrebbe risolvere il problema
. Si sta utilizzando il mysqldump
& mysql
dal 5,1 di 5,0?
si potrebbe provare diverse combo.
Potrebbe la SourceDB contenere valori duplicati nella colonna "unico"?
Rimuovere il vincolo "UNIQUE KEY" e verifica che i record sono duplicati nel TargetDB.
Questo potrebbe dare un po 'di comprensione del problema.
Specifica il set di caratteri dall'opzione --default-character-set
. E 'importante.