Wixoss-LinkageやD0-RSSでは、同じユーザ名では登録できないようにしていました。
具体的には、ユーザのmodelで、validates :uniqueness=>true でチェックしていました。
この度、すでに「パパ」というユーザ名がいると、「ハハ」や「ババ」のような濁音・半濁音違いの文字が同一と扱われてエラーになる問題が発生(「パパ」なら「すでにパパは使われています」のエラーメッセージを出せていたのですが、濁音・半濁音違いだとそのメッセージする表示されず、内部エラーページになってしまっていました)。
その問題の解決方法。
***
原因はMySQLのCollation設定
調べた結果、原因はMyAQLのCollation(照合順序)の設定でした。
Railsだと、Collationの初期設定はutf8_unicode_ciでした。
参考: utf8_unicode_ci に対する日本の開発者の見解 | かみぽわーる
utf8_unicode_ciは、日本語の濁音・半濁音を区別しない照合であることが原因でした。
その設定をutf8_general_ciにすれば良いようです。
2つの設定の違いは以下のリンクがわかりやすいです。
参考: utf8_general_ciとutf8_unicode_ci | 技術メモ帳
MySQLのCollationの設定を変える
データベースを作る前なら、railsのdatabase.ymlの設定からデフォルトのCollationを変えるのが良さそうです。
参考: ActiveRecordでデフォルトの照合順序を変更する | Qiita
一方で、すでに運用中のデータベースのCollationを変更するには、下記のリンクが参考になりました。
参考: MySQLの照合順序を修正する | Qiita
まさにドンピシャな内容。
リンク先にも手順は書かれていますが、コチラでもなぞっていきます。
(適宜、database名やtable名は読み替えて)
rails dbコマンドでdatabaseに接続
rails db production
(production環境のdatabaseなので、それを指定。パスワードを聞かれるので入力してdatabaseに接続)
該当のテーブルのカラムの属性を確認
show databases;
USE my_database;
show tables;
SHOW FULL COLUMNS FROM user_table;
これでuser_tableのカラム属性の一覧が表示される。
問題のhandle_nameカラムのCollationがutf8_unicode_ciになっている。
カラムのCollationを変更
ALTER TABLE user_table MODIFY COLUMN handle_name varchar(255) COLLATE 'utf8_general_ci';
handle_nameのカラムのCollationをutf8_general_ciに変更。
カラム名「handle_name」のあとに、カラムの型「textやvarchar(255)など」を指定することに注意。
変更されているか再度確認
SHOW FULL COLUMNS FROM user_table;
これでOKでした。
開発中は気づきにくい
開発中は、mysqlではなくsqlite3のデータベースを用いており、sqlite3の方ではこの問題が起こっていませんでした。それが今まで問題に気づかなかった要因の一つでした。