Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα!

Έχω ένα forum/database σε vBulletin 3.8.x και θέλω να μετατρέψω τη βάση σε UTF-8 (επιτέλους).

Θύμα κι εγώ τις παλιάς τακτικής οι αρχικές ρυθμίσεις στο config.php να κάνουν ISO/latin1 τις αρχικές εγκαταστάσεις vB3.

 

- Το site έχει κωδικοποίηση ISO-8859-7 για να φαίνονται σωστά οι ελληνικοί χαρακτήρες

- Στη σελίδα που φαίνονται οι πίνακες στο phpmyadmin, άλλοι έχουν Collation utf8_unicode_ci και άλλοι latin1_swedish_ci και ισχύει και το εξής: όσοι utf8_unicode_ci πίνακες έχουν text πεδία, είναι κι αυτά utf8_unicode_ci και το ίδιο για τους latin1_swedish_ci.

 

Η ερώτησή μου είναι, τι τύπου queries έχω να τρέξω για να μετατραπεί η βάση σε utf8;

- Πχ ας πούμε σαν βήμα είναι και τα swedish_ci να γίνουν unicode_ci και μετά να πιάσω έναν έναν τους πίνακες και να κάνω κάποια alters για τα text πεδία;

- Μπορεί αυτό να γίνει με ένα "σαρωτικό" query ή πρέπει να χρησιμοποιήσω PHP και να αρχίσω σε μια loop να κάνω updates μία μία τις γραμμές των text πεδίων για κάθε πίνακα;

- Τέλος υπάρχει κάποια ιδιαιτερότητα/ ειδική διεργασία που πρέπει να προσέξω/ κάνω; Η βάση έχει ελληνικούς και αγγλικούς χαρακτήρες

 

ΥΓ: Βρήκα κι αυτό στο διαδίκτυο, αν έχει κάποια αξία στην επίλυση του προβλήματος.

Δημοσ.

Δεν θα κανεις κάτι με php αρχειο, ουσιαστικα θα κανεις με ένα αεργαλειο όπως το php admin:

 

α) backup την βαση δεδομένων

β) Μετατροπή της βάσης σε utf_8 && collation σε utf8_unicode 

γ) έλεγχο πως όλα πήγαν καλά.

Δημοσ.

Thanks για την απάντηση lion!

Το collation βλέπω πως να το αλλάξω, τη μετατροπή σε utf-8 όμως πως την κάνω;

Το localhost μου όπου κάνω τις δοκιμές, έχει phpmyadmin 4.5.1.

 

Ακούγεται πιο απλό απ ότι περίμενα πάντως!

Δημοσ.

Θα πας είτε στα properties της Βάσης δεδομενων και θα τα αλλαξεις αυτα αλλα και σε κάθε Tables (ναι και σε αυτα θελει sryyy) που έχει η βάση μέσα ή θα τρέξεις τις ακολουθες εντολές...

 

κάνεις

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Και για καθε table
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci
 
Διάβασε και αυτο εδω πρώτα να δεις λιγο για τα utf8

http://stackoverflow.com/questions/6115612/how-to-convert-an-entire-mysql-database-characterset-and-collation-to-utf-8

  • Like 1
Δημοσ.

Επειδή είχα το ιδιο πρόβλημα πρόσφατα και δεν ήθελα να κάνω alter table σε κάθε πίνακα (βαρεμάρα) χρησιμοποίησα αυτό και έκανε δουλειά.

<?php
//change values for user, password, dbname before running

    $con = mysql_connect('localhost','user','password');
    if(!$con) { echo "Cannot connect to the database ";die();}
    mysql_select_db('database_name');
    $result=mysql_query('show tables');
    while($tables = mysql_fetch_array($result)) {
            foreach ($tables as $key => $value) {
                mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
        }}
    echo "The collation of your database has been successfully changed!";
    
?>
  • Like 1
Δημοσ.

Λοιπόν παιδιά έτρεξα το script. Βλέπω στο phpmyadmin ότι όντως άλλαξε το collation, όμως στη πράξη το site δε φαίνεται να έχει μετατραπεί σε UTF-8.

- Στο phpmyadmin εξακολουθώ να βλέπω παράξενους χαρακτήρες αντί για ελληνικά (εκεί που βλέπω τα δεδομένα καποιου πίνακα)

- Μιας που μιλάμε για vBulletin 3:

-- Άλλαξα το Όμάδα Χαρακτήρων HTML σε "UTF-8" για τη γλώσσα "Ελληνικά" που είναι η default

-- Ενεργοποίησα τη γραμμή $config['Mysqli']['charset'] = 'utf8'; στο /includes/config.php

 

Όμως το αποτέλεσμα είναι χαρακτήρες ρόμβοι με ερωτηματικό. Ειδικά όταν ενεργοποιώ το $config['Mysqli']['charset'] = 'utf8'; δεν μπορώ καν να σερφάρω στο site.

 

Καμιά ιδέα;

Δεν έχω ξανά ασχοληθεί με μετατροπές σε UTF-8, είχα βολευτεί τόσο καιρό στο ISO-8859-7 όμως πρέπει κάποια στιγμή να κάνω τη μετατροπή. :-)

 

Ευχαριστώ εκ των προτέρων για τη βοήθεια, αν θέλετε να με ρωτήσετε να τεστάρω κάτι και να σας πω σε τι φάση είναι, πείτε μου.

Δουλεύω στο localhost/XAMPP/Windows 10 αυτή τη στιγμή για τις δοκιμές.

Δημοσ.

Αν χρησιμοποιείς pdo τότε εκεί που κανείς connect στην βάση βάλε στον κώδικα $pdo = new PDO("mysql:host=localhost;dbname=mydb;charset=utf8",'my_user', 'my_pass');

 

Αν χρησιμοποιείς mysqli βάλε: $mysqli->set_charset("utf8")

Με λίγα λόγια εκεί που κανείς connect στην βάση άλλαξε τον κώδικα σύμφωνα με αυτά που έγραψα παραπάνω.

Δημοσ.

Καλημέρα παιδιά!
Λοιπόν, σας παραθέτω το ακριβές script που δοκιμάζω να τρέξω (όπου "dbname" το σχετικό value), που σύνθεσα από τις οδηγίες σας:

$mysqli = new mysqli("localhost", "root", "", "dbname");
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}
$mysqli->set_charset("utf8");

$mysqli->query("ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_unicode_ci");
$result = $mysqli->query('SHOW TABLES');
while($tables = $result->fetch_array(MYSQLI_ASSOC)) 
{
	foreach ($tables as $key => $value) 
	{
	   $mysqli->query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
	}
}
echo "The collation of your database has been successfully changed!";

Βλέπετε κάποιο λάθος;

 

Παρατήρησα τα εξής:

1. Την πρώτη φορά που το τρέχω αργεί πολύ, λόγω των πολλών πινάκων και δεδομένων. Αν δοκιμάσω να το τρέξω 2η φορά σε βάση δεδομένων που το έχω ήδη τρέξει (κάνω συνέχεια αντίγραφα για δοκιμές), η ολοκλήρωση της επεξεργασίας γίνεται άμεσα, χωρίς καμία καθυστέρηση (το δοκίμασα σαν 2η φορά μήπως κάτι στην αρχή πήγε λάθος με αλλαγές στον php κώδικα κτλ).

2. Δεν φαίνεται να γίνεται όντως μετατροπή των δεδομένων σε utf8. Το site - στο localhost - εξακολουθεί να λειτουργεί σωστά μόνο όταν είναι ορισμένο σε ISO-8859-7 και commented τη γραμμή $config['Mysqli']['charset'] = 'utf8'; στο /includes/config.php, ενώ στο phpmyadmin οι ελληνικοί χαρακτήρες εξακολουθούν να μη φαίνονται σωστά (αν σημαίνει κάτι αυτό).  :fear:

 

Να σημειώσω ότι θέλω να μετατρέψω και τα υπάρχοντα δεδομένα σε utf8, όχι μόνο "από δω και πέρα".

 

Καμιά ιδέα; :-)

Δημοσ.

Μάλλον δεν το εξήγησα σωστά.
Ο κώδικας που ανέφερα ποιο πάνω μπαίνει στο αρχείο που κανείς πάντα σύνδεση με την βάση σου.και όχι σε ενα αρχείο που εσύ έφτιαξες για να κάνεις την μετατροπή.Και όπου dbname βάζεις το όνομα της βάση σου.Αρχικά κάνε backup την βάση σου.Με export δηλαδή στην παλιά μορφή.Μέτα πάρε ένα αντίγραφο της βάσης και κάντο edit και όπου λέει για κωδικοποίηση άλλαξε το σε utf8 και κάντο import πάλι στην βάση.

 

p.s το αρχείο οταν το κάνεις export έχει κατάληξη .sql αυτό κάνεις edit και πάλι import.Το export το κάνεις εκεί που φαίνονται σωστά τα γράμματα δηλαδή iso κάτι.Κάνεις edit το sql αρχείο όπου λέει charset iso η κάτι άλλο που δεν είναι utf κάντο utf.Και πάλι import.

Και αυτό $mysqli->set_charset("utf8");

βάλτο στο αρχείο που κάνεις σύνδεση στη βάση.(λογικά αυτό το αρχείο το κάνεις require σε όλα τα php αρχεία και περιέχει κώδικα μόνο για την σύνδεση στη βάση.Εαν επαναλαμβάνεις τον κώδικα για την σύνδεση σου στη βάση σε κάθε αρχείο χωρίς require τότε άνοιξε notepad και κάνε αντικατάσταση σε όλα τα αρχεία.

 

 

Σαν να κάνεις maintain Legacy code μου φαίνεται που δεν είναι τόσο έυκολο πράγμα.

Δημοσ.

Ένα εύκολος τρόπος είναι να φτιάξεις μια html σελίδα με encoding ISO-8859-7 που μέσα θα έχεις τη db (export). Τότε από τον browser θα το κάνεις αντιγραφή και θα το κάνεις εισαγωγή σε unicode στη db μέσω το phpmyadmin

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...