Curiosamente, o Postgres também falha aqui:
[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]
Talvez devêssemos simplesmente tratar esse comportamento peculiar como um caso especial em nosso método interno do Discourse que calcula o username_lower?
Encontre todos os métodos que chamam username_lower, encadeie-os a uma função central e, em seguida, permita esse caso especial (acho que podemos usar uma chamada ao mini_racer aqui, se quisermos, ou simplesmente chamar .lower e corrigi-la depois com uma chamada a sub).
Atualizei o título do OP aqui para deixar mais claro.