起こったこと
絵文字入りのCSVファイルに対し、S3 Selectでクエリを投げてみます。
アップロードしたCSV
v_name,oshimark
周防パトラ,🦀❤️
蒼月エリ,🥀💎
島村シャルロット,♣️❄️
西園寺メアリ,🍼🔮
堰代ミコ,🔱🍏
SQL
select * from S3Object s where s.v_name = '周防パトラ' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.v_name like '%パ%' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark = '🦀❤️' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark like '%❤️%' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark like '%🦀%' -- -> 結果がありません
ん?
サロゲートペア文字が原因(っぽい)
Where likeでうまく結果をとれた「❤️」は、UTF-16のコードポイント上で U+2764 と U+FE0F (異体字セレクタ) ️で構成された文字に対し、「🦀」は U+1F980 のサロゲートペア文字です。
同じくサロゲートペア文字である「💎」「🍏」なども、Where likeで取得することができませんでした。
一方で、非サロゲートペア文字+異体字セレクタで構成された「♣️」などはちゃんとで取得できました。
AWS側のバグなのでしょうか・・・。
対策
絵文字がそのまま使えない以上、別のフォーマットで保存するほか無さそうです。
私の場合は、URLエンコードをかけた形式で保存することで対応しました。
v_name,oshimark
周防パトラ,%F0%9F%A6%80%E2%9D%A4%EF%B8%8F
蒼月エリ,%F0%9F%A5%80%F0%9F%92%8E
島村シャルロット,%E2%99%A3%EF%B8%8F%E2%9D%84%EF%B8%8F
西園寺メアリ,%F0%9F%8D%BC%F0%9F%94%AE
堰代ミコ,%F0%9F%94%B1%F0%9F%8D%8F