Azure SQL Database作成時に潜むバグの種
2019-12-25
azblob://2022/11/11/eyecatch/2019-12-25-attention-point-at-azure-sql-database-creation-000.jpg

Merry Christmas (๑•̀.•́ฅ✧

この記事はFIXER Advent Calendar 2019年 25日目の記事です。

FIXER cloud.config事業部 パートナー若月です。

はじめに

Azureに約10年間関わっていてよく出会うミスの1つがSQL Databaseの初歩的な作成ミスです。

このミス起因の不具合調査に大分時間を費やしてきました。その苦い経験を共有と撲滅を兼ねてこの機会にTech Blogに書こうと思います。

SQL Serverの照合順序(collation)とサロゲートペア文字について

※照合順序(collation)、サロゲートペア文字に関しての細かいことは調べてもらえば沢山説明しているblogがあるので割愛させてもらいます。興味がある方は調べてみてください。

今回表題にもなっている「作成時の注意点」、それは照合順序の設定なんです。私が作成していない環境でこの設定の不具合調査を依頼されると意外と調査にはまるんです。具体的にどういった不具合として出てくるのかというと、

  • 「住所検索が地名で引っかからない」
  • 「一覧画面に表示されている社名の順番がバラバラなんです」
  • 「文字が??になっているんですけど・・・」

といった具合に画面表示に直接関わるような不具合が出てきます。

「テストしているのになぜリリースするまで見つからないの?」と思う人もいるかと思うのですが、意外と見つからないんです。理由としては、

  • 照合順序、サロゲートペア文字に関して、作成時に意識されていないから当然テストケースにも入ってこない。
  • 案件的に社名、人名に関するケースが多いので、先頭文字が「(株)」だったり人名漢字だったりして、気づきにくい。
  • C#でLinqやSQLを使ってソート処理の実装は行うが、そもそもC#やSQL等の言語単位で提供されている処理のテストは行わない(提供されている時点で十分にテストが行われている想定の為)

といった理由からテスト時には見つからず、運用開始後に膨大なデータが登録されて不具合としてあがってくることが多いようです。

サロゲートペア文字に関してはそもそも調べないと気付かない文字ばかりなので余計に気づかなかったりします。例としては、「?(ほっけ)」「?(じょう)」等がこれにあたります。

実際にどんな並び順になるかは下の様になります。(どちらも実行SQLは「Select * From SampleTable Order By [Name]」と同じになっています。)

規定値でマウスクリックして作った場合(50音昇順)
適切に設定して作った場合(50音昇順)

Azure SQL Database作成時の設定

後からも変更可能ですが、テーブルのカラム単位に設定変更しなければいけなかったりと、リリース後に変更する手間を考えればデータベース作成時に設定する方が良いかと思います。

今回表題にしたのは下のスクリーンショットの赤枠を見てください。

規定値

初期設定が「SQL_Latin_1General_CP1_CI_AS」、そうラテンなんです。個人的には東日本リージョン、西日本リージョンは「Japanese_~」にしてほしいところなんですが、私がAzureに関わってからずっとラテンなんです。ちなみに少し上の説明には「データベース作成後は変更できません。」と書いてありますが、

後からでも変更できます!!

例)ALTER TABLE dbo.テーブル名 ALTER COLUMN カラム名 varchar(10)COLLATE Japanese_CI_AS;

細かい設定等はプロジェクト毎に調べてください。

まとめ

「 Azure環境作成時の設定はSQL Database以外でも慎重に!! 」

最後に

以前にcloud.config事業部内には共有したので今後作成されるデータベースに関しては「Japanese_~」 になるとは思うのですが、データベース作成を担当する人は注意して作成してください。

今回、Tech Blogを書くにあたって、門岡さんから

「Tech Blog、バトン渡しますよ(・`ω・´)キリッ!(関西弁風)」

と言われたり、門岡さんの書いた記事が高評価だったりと、個人的にハードル高くなったなぁと思いつつ、

「黒歴史にだけはならないように!」と心がけながら書きました。

なかなか内容の薄い記事になってしまったのですが、最後まで読んでくださり、ありがとうございました。