Noch immer konnte sich die Welt nicht auf einen gemeinsamen Zeichensatz einigen. Das wird wohl auch noch eine ganze Weile dauern. Falls es überhaupt nochmal dazu kommen sollte. Bis dahin werden wir alle immer mal wieder Spass mit dem konvertieren von Zeichensatz A nach Zeichensatz B haben.
Just beim Upgrade dieses Blogs, bin ich schon wieder in die Zeichensatzfalle getappt. Um mir mittelfristig die Nerven zu schonen und akut so schnell wie Möglich die häßlichen Zeichen aus der Datenbank zu schmeissen, habe ich ein kleines Ruby Skript geschrieben, dass mir die Umlaute bestimmter Tabellenfelder, durch HTML Entities ersetzt.
Einen Preis gewinne ich damit nicht, aber es tut seinen Job. Hier das Skript unverhüllt und häßlich wie es ist. Die Konfiguration sollte einfach nachzuvollziehen sein. Ansonsten einfach mal melden, gell?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #!/usr/bin/ruby -w # Konvertiere Umlaute der # Textfelder verschiedener MySQL # Tabellen require "mysql" @umlauts = { 'ü' => 'ü', 'ä' => 'ä', 'ö' => 'ö', 'Ü' => 'Ü', 'Ä' => 'Ä', 'Ö' => 'Ö', 'ß' => 'ß', "'" => ''' } # Hier beliebige Eintraege im Format # :tabellen_name => [:id_feld, :feld_1, :feld_2, :feld_n] # ergaenzen @targets = { :wp_comments => [:comment_id, :comment_content], :wp_posts => [:id, :post_content, :post_title] } begin dbh = Mysql.real_connect("hostname", "username", "password", "db_name") @targets.each_pair do |table, fields| query = "SELECT #{fields.join(',')} FROM #{table}" puts query res = dbh.query(query) while row = res.fetch_row do values = {} row.each_index do |i| if i > 0 values[fields[i]] = row[i]; @umlauts.each_pair do |umlaut,entity| values[fields[i]].gsub!(umlaut,entity) end end end blah = [] values.each_pair do |key,value| blah << "#{key}='#{value}'" end update_query = "UPDATE #{table} SET #{blah.join(',')} WHERE #{fields[0]}=#{row[0]}" res2 = dbh.query(update_query) puts update_query end end rescue Mysql::Error => e puts "Error code: #{e.errno}" puts "Error message: #{e.error}" puts "Error SQLSTATE: #{e.sqlstate}" if e.respond_to?("sqlstate") ensure dbh.close if dbh end |