Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
文字列の並び順 / String Collation
Search
とみたまさひろ
August 09, 2025
Technology
1
120
文字列の並び順 / String Collation
2025-08-09 nagano.rb #19 で発表したスライドの前半部分
とみたまさひろ
August 09, 2025
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
夢の印税生活 / Life on Royalties
tmtms
0
300
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
630
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.2k
Ruby on Browser
tmtms
1
2k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.1k
ショートカットと端末 / shortcut & terminal
tmtms
2
880
文字ときどきRuby / Character and Ruby (NSEG)
tmtms
2
2.3k
文字ときどきRuby / Character and Ruby
tmtms
0
990
Linux用キーリマッパーを作る技術 / How to make Key Remapper
tmtms
0
510
Other Decks in Technology
See All in Technology
異業種出身エンジニアが気づいた、転向して十数年経っても変わらない自分の武器とは
macnekoayu
0
290
Skrub: machine-learning with dataframes
gaelvaroquaux
0
120
AI駆動開発に向けた新しいエンジニアマインドセット
kazue
0
230
生成AIでセキュリティ運用を効率化する話
sakaitakeshi
0
150
Bye-Bye Query Spaghetti: Write Queries You'll Actually Understand Using Pipelined SQL Syntax
tobiaslampertlotum
0
140
Flutterでキャッチしないエラーはどこに行く
taiju59
0
220
MCPで変わる Amebaデザインシステム「Spindle」の開発
spindle
PRO
3
2.9k
Grafana MCPサーバーによるAIエージェント経由でのGrafanaダッシュボード動的生成
hamadakoji
1
1.3k
allow_retry と Arel.sql / allow_retry and Arel.sql
euglena1215
1
150
サンドボックス技術でAI利活用を促進する
koh_naga
0
190
kubellが考える戦略と実行を繋ぐ活用ファーストのデータ分析基盤
kubell_hr
0
140
オブザーバビリティが広げる AIOps の世界 / The World of AIOps Expanded by Observability
aoto
PRO
0
310
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
231
18k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
139
34k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
840
Scaling GitHub
holman
463
140k
Practical Orchestrator
shlominoach
190
11k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
358
30k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Balancing Empowerment & Direction
lara
3
610
Transcript
文字列の並び順 2025-08-09 nagano.rb (…で発表したやつの前半) とみたまさひろ 1
自己紹介 • とみたまさひろ • • • 最近アイコン変えた https://bsky.app/profile/tmtms.net https://blog.tmtms.net 2
MySQL徹底入門第5版 • 2025/6/16 発売! • 初版は2001年発売 • 1割くらい書きました • 11章「文字コードと日本語環境」
https://www.shoeisha.co.jp/book/detail/9784798189307 3
Software Design 9月号 • 2025/8/18発売 • 第2特集第2章「データベースにおける文字コードの落とし穴」 https://gihyo.jp/magazine/SD/archive/2025/202509 4
また文字コードの話をします 見どころは下にいるネコです 5
こんな回答したことありませんか? 「このリストは何順で並んでるんですか?」 …コードを読んでみる… 「名前の文字コード順です」 SELECT 〜 ORDER BY name 6
本当? 7
本当っぽい postgres=# SELECT name,name::bytea byte FROM t ORDER BY name;
name | byte --------+---------------------- 123 | \x313233 abc | \x616263 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e (4 rows) 8
あれ? 61 の方が 41 よりも先に…? name | byte ------+---------- abc
| \x616263 ABC | \x414243 9
あれれ? 61 と 41 が交互に…? name | byte ------+---------- aaa
| \x616161 AAA | \x414141 abc | \x616263 ABC | \x414243 10
あれれれ? name | byte --------+---------------------- 123 | \x313233 123 |
\xefbc91efbc92efbc93 456 | \x343536 456 | \xefbc94efbc95efbc96 name | byte ------+---------- ㋿ | \xe38bbf ← これはいい ㍽ | \xe38dbd ← 末尾 d ㍻ | \xe38dbb ← b ㍾ | \xe38dbe ← e ㍼ | \xe38dbc ← c 11
何順なんだ? 12
コレーション 日本語だと「照合順序」 13
コレーションの指定方法 • CREATE TABLE 時にカラムごとに指定する • MySQLの場合はテーブル単位でも指定可 • クエリ内の文字列や文字列カラムの後ろに COLLATE
コレーション名 を指定する CREATE TABLE t (s VARCHAR COLLATE unicode) CREATE TABLE t (s VARCHAR(1000)) COLLATE utf8mb4_0900_as_cs SELECT * FROM t ORDER BY s COLLATE unicode 14
MySQLのコレーション • MySQL組み込み • 実行環境には依存しない • Unicode 9 ベース •
最新は Unicode 16 なので結構古い • SHOW COLLATION で一覧できる • 全部で286個 / utf8mb4 のコレーションは 89個 • デフォルトはアクセント記号や大文字小文字等を無視 15
MySQLのコレーション • データベース、テーブル、カラムごとに設定できる • 接続のコレーションは SHOW VARIABLES で見れる SHOW VARIABLES
LIKE 'collation%'; +----------------------+--------------------+ | Variable_name | Value | +----------------------+--------------------+ | collation_connection | utf8mb4_0900_ai_ci | | collation_database | utf8mb4_0900_ai_ci | | collation_server | utf8mb4_0900_ai_ci | +----------------------+--------------------+ 16
PostgreSQLのコレーション • デフォルトではOSのコレーションなので環境に依存 • Unicode ベースのコレーションも選択可 • 外部ライブラリの libicu で対応
• 最新の Unicode 16 まで対応 • SELECT * FROM pg_collation で一覧できる • 全部で920個(環境による) • Unicode のコレーションは 817個 17
PostgreSQLのコレーション • カラムごとに設定できる • デフォルトのコレーションは psql の \l で見れる Locale
Provider が libc の場合は OS に依存 postgres=# \l postgres List of databases -[ RECORD 1 ]-----+----------- Name | postgres Owner | postgres Encoding | UTF8 Locale Provider | libc ← これ Collate | en_US.utf8 ← これ Ctype | en_US.utf8 Locale | ICU Rules | Access privileges | 18
Ubuntu の場合 en_US.utf8 の場合: ja_JP.utf8 の場合: 文字コード順ぽいけどちょっと違う name | byte
--------+---------------------- 123 | \x313233 123 | \xefbc91efbc92efbc93 456 | \x343536 456 | \xefbc94efbc95efbc96 aaa | \x616161 AAA | \x414141 abc | \x616263 ABC | \x414243 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e name | byte --------+---------------------- 123 | \x313233 456 | \x343536 AAA | \x414141 ABC | \x414243 aaa | \x616161 abc | \x616263 123 | \xefbc91efbc92efbc93 456 | \xefbc94efbc95efbc96 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e 19
C ロケールは単純に文字コード順 en_US.utf8 の場合: ja_JP.utf8 の場合: C の場合: 文字コード順 name
| byte --------+---------------------- 123 | \x313233 123 | \xefbc91efbc92efbc93 456 | \x343536 456 | \xefbc94efbc95efbc96 aaa | \x616161 AAA | \x414141 abc | \x616263 ABC | \x414243 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e name | byte --------+---------------------- 123 | \x313233 456 | \x343536 AAA | \x414141 ABC | \x414243 aaa | \x616161 abc | \x616263 123 | \xefbc91efbc92efbc93 456 | \xefbc94efbc95efbc96 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e name | byte --------+---------------------- 123 | \x313233 456 | \x343536 AAA | \x414141 ABC | \x414243 aaa | \x616161 abc | \x616263 あいう | \xe38182e38184e38186 日本語 | \xe697a5e69cace8aa9e 123 | \xefbc91efbc92efbc93 456 | \xefbc94efbc95efbc96 20
Ruby の sort は文字コード順 PostgreSQL と Ruby ではソート順が異なる 気をつけてないと画面によって並び順が違うなんてことも 21
macOSのソートはアホで困る % cat a.txt 千葉県千葉市 千葉県市川市 千葉県柏市 東京都北区 東京都千代田区 東京都大田区
東京都江戸川区 東京都江東区 東京都港区 % sort a.txt 千葉県柏市 東京都北区 東京都港区 千葉県千葉市 千葉県市川市 東京都大田区 東京都江東区 東京都千代田区 東京都江戸川区 https://blog.tmtms.net/entry/202412-macos-sort 22
どうやら直ったらしい 「【朗報】macOS 15.4でsortコマンドのソート順がまともに修正されました! 〜 マーズと マーキュリーの間にジュピターが割り込んでいた理由 #grep - Qiita」 https://qiita.com/ko1nksm/items/ce20e643bd83a72850b2
23
Unicode のコレーション 24
Unicode Collation Algorithm (UCA) Unicode の照合順序のアルゴリズム https://unicode.org/reports/tr10/ 25
完全版は58ページあるけどとりあずここまで! 続きは Software Design で! ネコチャン絵文字 ©しかまつ https://note.com/shikamatsu/n/nd217dc0617db 26