Интересно, что Postgres тоже здесь не справляется:
[2] pry(main)> DB.query_single('select lower(?)', 'ΣΠΥΡΟΣ')
=> ["σπυροσ"]
Возможно, нам стоит просто обработать эту особенность в нашем внутреннем методе Discourse, который вычисляет username_lower?
Найти все методы, вызывающие username_lower, перенаправить их в центральную функцию и предусмотреть обработку этого случая (думаю, здесь можно использовать вызов mini_racer, если захотим, или просто вызвать .lower и затем исправить результат с помощью вызова sub).
Обновил заголовок в первом посте для большей ясности.