添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

イタンジ株式会社の磯谷です。不動産賃貸仲介業向けのSaaSである ノマドクラウド の開発をしています。

ノマドクラウドではRailsとMySQLを使用して開発を行っています。その中で、VARCHAR型のカラムに格納されている値の、比較時の末尾の空白の取り扱いについてつまづいたので、今回はその点について書いていこうと思います。

MySQLの環境は以下です。

  • MySQL 8.0
  • 文字セット utf8mb4
  • 照合順序 utf8mb4_general_ci
  • つまづいたこと

    あるテーブルについてVARCHAR型のカラムに格納されている値を用いてレコードを検索するという要件がありました。このとき、そのテーブルには該当のVARCHAR型のカラムに、末尾の空白の有無のみが異なる値、例えば a という値と、 a という値を格納したレコードがそれぞれ存在しており、またその2つのレコードを区別する必要がありました。

    以下のようなコードによってその検索を行おうと思っていたのですが、該当のVARCHAR型のカラムの値の末尾の空白を区別せずに a という値を格納したレコードを取得してしまっており、それら空白の有無のみが異なる値を持つレコードの区別につまづいてしまいました。

    Model.find_by(column_name: 'a ') # SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column_name` = 'a ' LIMIT 1
    # => #<Model:0x00...
    #  ...
    #  column_name: "a",
    #  ...>
    

    区別されなかった理由

    この、末尾の空白が区別されない点についてはMySQLのこちらのドキュメントの最後に記載されています。