db-patch-mysql-utf8.pl 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #!/usr/bin/perl
  2. #
  3. # Copyright (C) Roman Dmitiriev, rnd@rajven.ru
  4. #
  5. use utf8;
  6. use FindBin '$Bin';
  7. use lib "/opt/Eye/scripts";
  8. use Data::Dumper;
  9. use eyelib::config;
  10. use eyelib::main;
  11. use eyelib::database;
  12. use strict;
  13. use warnings;
  14. my @tables = get_records_sql($dbh,"SHOW TABLES");
  15. my @db_tables=();
  16. foreach my $table_ref (@tables) {
  17. push(@db_tables,$table_ref->{Tables_in_stat});
  18. }
  19. print "Stage1: Migrate tables to UTF8 format\n";
  20. for my $table (@db_tables) {
  21. print "Apply table $table\n";
  22. $dbh->do("SET foreign_key_checks = 0;");
  23. do_sql($dbh,"ALTER TABLE `".$table."` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
  24. $dbh->do("SET foreign_key_checks = 1;");
  25. }
  26. print "Done\n";
  27. print "Stage2: Migrate database\n";
  28. do_sql($dbh,"ALTER DATABASE ".$DBNAME." CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
  29. print "Done\n";
  30. print "Stage3: Revert filed type to TEXT\n";
  31. for my $table (@db_tables) {
  32. my $sql = "select * from $table LIMIT 1";
  33. my $sth = $dbh->prepare( $sql );
  34. $sth->execute();
  35. print "\tStructure of $table \n\n";
  36. my $num_fields = $sth->{NUM_OF_FIELDS};
  37. for ( my $i=0; $i< $num_fields; $i++ ) {
  38. my $field = $sth->{NAME}->[$i];
  39. my $type = $sth->{TYPE}->[$i];
  40. my $precision = $sth->{PRECISION}->[$i];
  41. print "\t\tField: $field is of type: $type precision: $precision\n";
  42. if ($type == "-4" and $precision>262140) {
  43. print "\t\tMigrate field $field to type TEXT\n";
  44. do_sql($dbh,"ALTER TABLE `".$table."` MODIFY `".$field."` TEXT");
  45. }
  46. }
  47. $sth->finish();
  48. }
  49. print "Done!\n";
  50. exit;