ãã㯠SmartHR Advent Calendar 2024 ã·ãªã¼ãº2 ã®2æ¥ç®ã®è¨äºã§ãã
ã¡ãã£ã¨åã«ãã¤ã¼ãããã®ãã¾ãã¾ãè¦ãããã¿ãããªã®ã§ãã¡ããã¨æ¸ãã¦ã¿ãï¼æ±ãè¨èã¯è¯ããªããï¼ã
ãã¼ã«ãã¼ã«ï¼ pic.twitter.com/lSWwo8AhK1
— ã¨ã¿ãã¾ãã²ãð£ðº (@tmtms) 2024å¹´11æ20æ¥
macOS ã§æ¬¡ã®ããã¹ããã¡ã¤ã«ã sort ã³ãã³ãã§ã½ã¼ãããã¨ãã¿ã©ã¡ã«ä¸¦ã¶ãã§ããã
åèçåèå¸ åèçå¸å·å¸ åèçæå¸ æ±äº¬é½ååº æ±äº¬é½å代ç°åº æ±äº¬é½å¤§ç°åº æ±äº¬é½æ±æ¸å·åº æ±äº¬é½æ±æ±åº æ±äº¬é½æ¸¯åº
$ sort a.txt åèçæå¸ æ±äº¬é½ååº æ±äº¬é½æ¸¯åº åèçåèå¸ åèçå¸å·å¸ æ±äº¬é½å¤§ç°åº æ±äº¬é½æ±æ±åº æ±äº¬é½å代ç°åº æ±äº¬é½æ±æ¸å·åº
æåã®ã³ã¼ããç¡è¦ãã¦æåæ°ã ãã§ä¸¦ãã§ãããã«è¦ããã使ãç©ã«ãªããªããmacOS ã¢ããããã
åå 㯠/usr/share/locale/ja_JP.UTF-8/LC_COLLATE
ãã¡ã¤ã«ã la_LN.US-ASCII/LC_COLLATE
ã«ãªã³ã¯ããã¦ãããã£ã½ãã
$ cd /usr/share/locale/ $ ls -l ja_JP.UTF-8/LC_COLLATE lrwxr-xr-x 1 root wheel 28 10 15 20:22 ja_JP.UTF-8/LC_COLLATE -> ../la_LN.US-ASCII/LC_COLLATE
LC_COLLATE
ã¯æåã®ç
§åè¦åã決ãããã®ã§ãããã ASCII æåã®ããã®ãã¡ã¤ã«ãæãã¦ãã¨ãããã¨ã§ãASCII æå以å¤ã¯å
¨é¨åå¤ã¨ãã¦ã¿ãªãã¦ãã¨ãããã¨ãããã
ã¤ã¾ããããããã¼ã¿ãã½ã¼ããã¦ãã®ã¨åãããããæåé·é ã«ä¸¦ã¶ããªãåãæåã¨ã¿ãªãããå ´åã¯æåã³ã¼ãã®é ã«ä¸¦ã¶ã¿ããã ãã©ãã
������ ������ ����� ����� ������� ������ ������� ������ �����
ãªã LC_COLLATE=C
ãæå®ãããã¨ã§åç´ãªãã¤ãåã¨ãã¦ã½ã¼ããããã®ã§ãæåã³ã¼ãé ã«ã½ã¼ããããã
$ LC_COLLATE=C sort a.txt åèçåèå¸ åèçå¸å·å¸ åèçæå¸ æ±äº¬é½ååº æ±äº¬é½å代ç°åº æ±äº¬é½å¤§ç°åº æ±äº¬é½æ±æ¸å·åº æ±äº¬é½æ±æ±åº æ±äº¬é½æ¸¯åº
ãã¨ãã¨ããã«æ°ãã¤ããã®ã¯ sort ã³ãã³ãã§ã¯ãªã㦠PostgreSQL ã® ORDER BY
ã§ã®ã½ã¼ãããããããªã£ãããã ã£ãã
ä¼ç¤¾ã®éçºç¨ã® PC 㯠MacBook ãªãã ãã©ãPostgreSQL 㯠Docker ã使ã£ã¦ Linux ä¸ã§åããã¦ãããã®ããã§ããªãé ããã§ãDocker 使ããã« macOS ä¸ã§ç´æ¥åãããã¨ãããã½ã¼ãé ããããããªã£ãã
PostgreSQL ã®ãã±ã¼ã«ã¯ä½ãããªã㨠libc ã使ãããã®ã§ãOS ç°å¢ã«ä¾åããã
$ initdb -U postgres /tmp/hoge
postgres=# \x æ¡å¼µè¡¨ç¤ºã¯ on ã§ãã postgres=# \l postgres ãã¼ã¿ãã¼ã¹ä¸è¦§ -[ RECORD 1 ]--------+---------------- åå | postgres ææè | masahiro.tomita ã¨ã³ã³ã¼ãã£ã³ã° | UTF8 ãã±ã¼ã«ãããã¤ãã¼ | libc ç §åé åº | ja_JP.UTF-8 Ctype(å¤ææ¼ç®å) | ja_JP.UTF-8 ICUãã±ã¼ã« | ICUã«ã¼ã«: | ã¢ã¯ã»ã¹æ¨©é |
ãã®ç¶æ 㧠ORDER BY ãã㨠OS ã¨åãã¢ããªåã«ãªã£ã¦ããã¨ããããã
postgres=# create table test (c varchar); CREATE TABLE postgres=# insert into test (c) values ('ããããã'),('ãããã'),('ããã'),('ãã'),('ã'); INSERT 0 5 postgres=# select * from test; c ------------ ããããã ãããã ããã ãã ã (5 è¡) postgres=# select * from test order by c; c ------------ ã ãã ããã ãããã ããããã (5 è¡)
RDB ã® Collation ã«ããå¦ãªæå㧠MySQL ã®å¯¿å¸ãã¼ã«åé¡ãæãåºãããã
ããï¼ MySQL ã® utf8mb4 charset ã£ã¦ã4ãã¤ãæåå士ãæ¯è¼ããã¨åãæåæ±ããããï¼
— ã¨ã¿ãã¾ãã²ãð£ðº (@tmtms) 2014å¹´12æ22æ¥
SELECT 'ð£'='ðº' â 1
MySQLçã«ã¯å¯¿å¸ã¨ãã¼ã«ã¯åãæ±ãã
sort ã§ãã£ãã®ã¨åãããã« initidb æã« --lc-collate=C
ãæå®ããããã¾ããã£ãã
$ initdb -U postgres --lc-collate=C /tmp/hoge
postgres=# \l postgres ãã¼ã¿ãã¼ã¹ä¸è¦§ -[ RECORD 1 ]--------+------------ åå | postgres ææè | postgres ã¨ã³ã³ã¼ãã£ã³ã° | UTF8 ãã±ã¼ã«ãããã¤ãã¼ | libc ç §åé åº | C Ctype(å¤ææ¼ç®å) | ja_JP.UTF-8 ICUãã±ã¼ã« | ICUã«ã¼ã«: | ã¢ã¯ã»ã¹æ¨©é | postgres=# select * from test order by c; c ------------ ããããã ãããã ããã ãã ã (5 è¡)
ããããã¨ã³ã³ã¼ãã£ã³ã°ãUTF-8 ãªã®ã« COLLATE ã C ã¨ããã®ã¯ã©ããªãã ãããªã¼â¦ã¨æã£ã¦ãPostgreSQL 㯠libc ãã±ã¼ã«ä»¥å¤ã«ã ICU ãã±ã¼ã«ã使ããã®ã§ããããæå®ãããã¨ã«ããã
$ initdb -U postgres --locale-provider=icu --icu-locale=ja_JP.UTF-8 /tmp/hoge
postgres=# \l postgres ãã¼ã¿ãã¼ã¹ä¸è¦§ -[ RECORD 1 ]--------+------------ åå | postgres ææè | postgres ã¨ã³ã³ã¼ãã£ã³ã° | UTF8 ãã±ã¼ã«ãããã¤ãã¼ | icu ç §åé åº | ja_JP.UTF-8 Ctype(å¤ææ¼ç®å) | ja_JP.UTF-8 ICUãã±ã¼ã« | ja-JP ICUã«ã¼ã«: | ã¢ã¯ã»ã¹æ¨©é | postgres=# select * from test order by c; c ------------ ããããã ãããã ããã ãã ã (5 è¡)
ããã macOS 㯠UI ã使ãã«ããã¨ã¯æã£ã¦ããã OS ã¨ãã¦ããã¡ã ã£ãã¨ã¯ãªãã ããã¾ã macOS ãªãã¦ä½¿ããã« Docker ã³ã³ãã使ãã°ã¾ã¨ã㪠Linux ã使ãããã ãã©ããã¾ãã«ãé ããã§â¦ã
ã¦ããããéçºã«ãã¹ã¯ããã Linux 使ãããã