db-patch-mysql-utf8.pl 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 eyelib::common;
  13. use strict;
  14. use warnings;
  15. my @tables = get_records_sql($dbh,"SHOW TABLES");
  16. my @db_tables=();
  17. foreach my $table_ref (@tables) {
  18. push(@db_tables,$table_ref->{Tables_in_stat});
  19. }
  20. print "Stage1: Migrate tables to UTF8 format\n";
  21. for my $table (@db_tables) {
  22. print "Apply table $table\n";
  23. $dbh->do("SET foreign_key_checks = 0;");
  24. do_sql($dbh,"ALTER TABLE `".$table."` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
  25. $dbh->do("SET foreign_key_checks = 1;");
  26. }
  27. print "Done\n";
  28. print "Stage2: Migrate database\n";
  29. do_sql($dbh,"ALTER DATABASE ".$DBNAME." CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;");
  30. print "Done\n";
  31. print "Stage3: Revert filed type to TEXT\n";
  32. for my $table (@db_tables) {
  33. my $sql = "select * from $table LIMIT 1";
  34. my $sth = $dbh->prepare( $sql );
  35. $sth->execute();
  36. print "\tStructure of $table \n\n";
  37. my $num_fields = $sth->{NUM_OF_FIELDS};
  38. for ( my $i=0; $i< $num_fields; $i++ ) {
  39. my $field = $sth->{NAME}->[$i];
  40. my $type = $sth->{TYPE}->[$i];
  41. my $precision = $sth->{PRECISION}->[$i];
  42. print "\t\tField: $field is of type: $type precision: $precision\n";
  43. if ($type == "-4" and $precision>262140) {
  44. print "\t\tMigrate field $field to type TEXT\n";
  45. do_sql($dbh,"ALTER TABLE `".$table."` MODIFY `".$field."` TEXT");
  46. }
  47. }
  48. $sth->finish();
  49. }
  50. print "Done!\n";
  51. exit;