Just because it's:

Archive for July, 2008

Ein Hack für MySQL um Umlaute zu konvertieren

Friday, July 25th, 2008

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