MySQL: Duplicate entry for key

ndemou at gmail.com ndemou at gmail.com
Tue Sep 18 10:55:26 EEST 2007


<disclaimer>
Τα παρακάτω δεν θα σου λύσουν το πρόβλημα αλλά θα σε βοηθήσουν να μην
πελαγοδρομείς ψάχνοντας τη λύση
</disclaimer>

On 9/18/07, Panagiotis Palias <palias at ath.forthnet.gr> wrote:
> Επανέρχομαι στο θέμα μιας και βρέθηκε ένα backup από mysqldump, ποιο
> [...]
> Δοκίμασα με την εντολή
> cat dump.sql | iconv -f utf-8 -t iso8859-1 | iconv -f iso8859-7 -t utf-8
> iconv: illegal input sequence at position 76

το UTF-8 [1] είναι αναπαράσταση του Unicode[2] πίνακα χαρακτήρων (περ.
100.000 χαρακτήρες από σχεδόν όλες τις σύγχρονες και μη γλώσσες μεταξύ
των οποίων και οι ελληνικοί)

το iso8859-1 [3] είναι αναπαράσταση ενός πίνακα λατινικών χαρακτήρων
(περ. 150 χαρακτήρες μεταξύ των οποίων ΔΕΝ είναι οι ελληνικοί)

το iso8859-7 [4] είναι αναπαράσταση ενός πίνακα λατινικών και
ελληνικών χαρακτήρων. 3 κωδικοί που χρησιμοποιούνται στην iso8859-1
αναπαράσταση δεν χρησιμοποιούνται στην iso8859-7 αναπαράσταση
(σύγκρινε τους πίνακες στις σελίδες [3] και [4])

Με βάση τα παραπάνω:

σχετικά με το:
> cat dump.sql | iconv -f utf-8 -t iso8859-1

αν το dump.sql είναι όντως utf-8 και έχει χαρακτήρες εκτός λατινικών
(π.χ. ελληνικά) αυτή η εντολή θα βγάλει error (γιατί η iso8859-1 δεν
μπορεί να αναπαραστήσει μη λατινικούς χαρακτήρες)

αν το dump.sql δεν είναι utf-8 τότε αυτή η εντολή στις περισσότερες
περιπτώσεις επίσης θα βγάλει error (εξαρτάται τι χαρακτήρες θα έχει το
dump.sql π.χ. αν είναι ελληνικά σε iso8859-7 θα βγάλει *σίγουρα*
error). Γιατί όταν λες στην iconv ότι το input είναι utf-8 το input
ΠΡΕΠΕΙ να είναι utf-8 (παραξενιά αλλά έτσι δουλεύει)

σχετικά με το:
> ...iso8859-1 | iconv -f iso8859-7 -t utf-8

εδώ στην iconv λες ότι το input είναι 8859-7 ενώ στην πραγματικότητα
τις δίνεις iso8859-1. Αν στο input σου τύχει να έχεις έναν απο τους
3εις κωδικούς (AE, D2, FF) οι οποίοι χρησιμοποιούνται στο -1 αλλά όχι
στο -7 τότε και πάλι η iconv θα χτυπήσει

> [...]
> Υπάρχει κάτι άλλο που μπορώ να κάνω;

Α) δεν θυμάμαι πλέον όλο το πρόβλημα αλλά μια ΠΟΛΥ ΣΗΜΑΝΤΙΚΗ ΑΡΧΗ
είναι η παρακάτω και είναι πολύ απλή: άνοιξε το αρχείο με έναν editor
και δες με τα ματάκια σου πια κωδικοποίηση θα σου εμφανίσει
περιεχόμενο που βγάζει νόημα (δεν έχει αλαμπουρνέζικα ούτε ερωτηματικά
αλλά όμορφα ελληνικά). 99.999999% θα είναι μία απο τις τρεις κλασικές:
utf-8, iso8859-7, cp1253. Προσοχή η cp1253 και iso8859-7 έχουν 2-3
διαφορές μόνο οπότε μπορεί να μπερδευτείς. Ψάξε για ¶ (κεφαλαίο Α με
τόνο) - αν το βλέπεις σωστά είσαι ΟΚ. Ένας βολικός GUI editor είναι ο
kwrite γιατί αλλάζεις το encoding on the fly αλλά υπάρχουν ένα σωρό
άλλοι.

Β) έχοντας κατά νου τα [1],[2],[3],[4] δες τα παρακάτω παραδείγματα:

$ locale | head -n 2
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
$ # είμαι σε UTF-8 locale οπότε το αρχείο που θα φτιάξω θα είναι επίσης σε UTF-8
$ echo "abcd" > test
$ echo "αβγδ" >> test
$ cat test
abcd
αβγδ

$ hexdump -C test
00000000  61 62 63 64 0a ce b1 ce  b2 ce b3 ce b4 0a        |abcd..........|
$ # πρόσεξε πως τα ελληνικά είναι 2 bytes με το πρώτο να είναι πάντα ce

$ cat test | iconv -f utf-8 -t iso8859-7 > test.8859-7
$ cat test | iconv -f utf-8 -t WINDOWS-1253 > test.cp1253
$ # μόλις μετέτρεψα το test σε iso8859-7 και σε cp1253

$ hexdump -C test.8859-7
00000000  61 62 63 64 0a e1 e2 e3  e4 0a                    |abcd......|
$ # εδώ τα ελληνικά είναι ένα byte ο χαρακτήρας όπως βλέπεις

$ hexdump -C test.cp1253
00000000  61 62 63 64 0a e1 e2 e3  e4 0a                    |abcd......|
$ # και πάλι τα ελληνικά είναι ένα byte ανά χαρακτήρα και... χμ...
ολόιδιο με το iso8859-7 - μπα?

$ # για να δούμε που είναι η διαφορά μεταξύ iso και cp
$ echo "αβγδ¶ΈΊΌ" |  iconv -f utf-8 -t iso8859-7  | hexdump -C
00000000  e1 e2 e3 e4 b6 b8 ba bc  0a                       |.........|
$ echo "αβγδ¶ΈΊΌ" |  iconv -f utf-8 -t WINDOWS-1253  | hexdump -C
00000000  e1 e2 e3 e4 a2 b8 ba bc  0a                       |.........|
$ # αν προσέξετε η μόνη διαφορά είναι στο ¶

$ # και τώρα τα errors:

$ cat test | iconv -f utf-8 -t iso8859-1
abcd
iconv: illegal input sequence at position 5
$ # η iconv χτύπησε στην "θέση 5"
$ # πρόσεξε ότι το ελληνικό α είναι ο 5ος χαρακτήρας
$ # (μετρώντας απο το 0 και πέρνωντας υπόψη και τον έναν χαρακτήρα 0a
για την αλλαγή γραμμής)
$ head -n 1 test | iconv -f utf-8 -t iso8859-1
abcd
$ # η iconv δεν χτύπησε όταν τις περάσαμε μόνο την πρώτη γραμμή (που
είναι λατινικά)
$ cat test.8859-7 | iconv -f utf-8 -t iso8859-1
abcd
iconv: illegal input sequence at position 5
$ # και πάλι χτυπάει στα ελληνικά γιατί τις είπα ότι είναι utf-8 ενώ
είναι iso8859-7
$ cat test.8859-7 | iconv -f iso8859-7 -t iso8859-1
abcd
iconv: illegal input sequence at position 5
$ # και πάλι γιατί το α δεν μπορεί να αναπαρασταθεί σε iso8859-1
$ cat test.8859-7 | iconv -f iso8859-7 -t  WINDOWS-1253
abcd
??
$ # τώρα δουλεύει κανονικά
$ # ο λόγος που βλέπουμε ?? είναι πως η κονσόλα μου περιμένει να λάβει
utf8 απο τις εντολές που τρέχουν ενώ η iconv της στέλνει cp1253 (γιατί
έτσι την διατάξαμε)


_______________
[1] wikipedia page for utf-8
[2] wikipedia page for unicode
[3] wikipedia page for iso8859-1
[4] wikipedia page for iso8859-7

-- 
Σεβασμός της ανθρώπινης ζωής και του περιβάλλοντος στην Ελλάδα:
http://news.kathimerini.gr/4dcgi/_w_articles_ell_100007_08/07/2007_233651
http://news.kathimerini.gr/4dcgi/_w_articles_ell_100008_08/07/2007_233650
Περίληψη: αν μπορείτε να διαθέσετε 2-5 χιλ. ευρώ σκοτώστε και μολύνετε ελεύθερα




More information about the Linux-greek-users mailing list