Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MySQLと令和 / MySQL with Reiwa

MySQLと令和 / MySQL with Reiwa

とみたまさひろ

August 10, 2019
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

  1. MySQLでは MySQLでは 一致 mysql> set @a='令和', @b='令和'; mysql> select @a,

    @b, hex(@a), hex(@b); +--------+--------+--------------+--------------+ | @a | @b | hex(@a) | hex(@b) | +--------+--------+--------------+--------------+ | 令和 | 令和 | E4BBA4E5928C | EFA6A8E5928C | +--------+--------+--------------+--------------+ mysql> select @a=@b; +-------+ | @a=@b | +-------+ | 1 | ← ❗❗ +-------+ 8
  2. 9

  3. MySQLでは MySQLでは ※都合により同じ字体に見えてます 一致 mysql> set @a='令和', @b='令 和', @c='令

    和'; mysql> select hex(@a), hex(@b), hex(@c)\G *************************** 1. row *************************** hex(@a): E4BBA4E5928C hex(@b): E4BBA4F3A08481E5928C hex(@c): E4BBA4F3A08482E5928C mysql> select @a=@b, @b=@c; +-------+-------+ | @a=@b | @b=@c | +-------+-------+ | 1 | 1 | ← ❗❗ +-------+-------+ 13
  4. 14

  5. 合字 合字 明治(U+660E U+6CBB) ㍾(U+337E) ⼤正(U+5927 U+6B63) ㍽(U+337D) 昭和(U+662D U+548C)

    ㍼(U+337C) 平成(U+5E73 U+6210) ㍻(U+337B) 令和(U+4EE4 U+548C) ㋿(U+32FF) 18
  6. MySQLでは MySQLでは mysql> select '明治'='㍾', '大正'='㍽', '昭和'='㍼', -> '平成'='㍻', '令和'='㋿'\G

    *************************** 1. row *************************** '明治'='㍾': 1 ← 一致❗ '大正'='㍽': 1 ← 一致❗ '昭和'='㍼': 1 ← 一致❗ '平成'='㍻': 1 ← 一致❗ '令和'='㋿': 0 ← 不一致❗ 19
  7. 20

  8. Unicodeの照合順序 Unicodeの照合順序 Unicode Collation Algorithm (UCA) Default Unicode Collation Element

    Table (DUCET) 文字毎にWeightという値が定義されている Weightが等しいなら等しい文字 https://unicode.org/reports/tr10/tr10-34.html https://www.unicode.org/Public/UCA/9.0.0/allkeys.txt 23
  9. 「令」 U+4EE4 CJK UNIFIED IDEOGRAPH DUCETには無いけど計算で求まる 「令」 U+F9A8 CJK COMPATIBILITY

    IDEOGRAPH DUCETにある Weightが一致するから等しい [.FB40.0020.0002][.(CP | 0x8000).0000.0000] → [.FB40.0020.0002][.CEE4.0000.0000] F9A8 ; [.FB40.0020.0002][.CEE4.0000.0000] 25
  10. 異体字セレクタ 「令」 U+4EE4 「令」 U+4EE4 U+E0101 「 」 U+4EE4 U+E0102

    異体字セレクタはDUCETにある UCAではすべてゼロの文字は無視 E0101 ; [.0000.0000.0000] # VARIATION SELECTOR-18 E0102 ; [.0000.0000.0000] # VARIATION SELECTOR-19 27
  11. utf8mb4_0900_ai_ci utf8mb4_0900_ai_ci MySQLのデフォルトのCollation 要素 意味 utf8mb4 4バイトUTF-8 0900 Unicode 9.0.0

    ai アクセントの違いを無視 ci 大文字小文字の違いを無視 ciの場合はWeightの3番目を無視 30
  12. 「㋿」はUnicode 12.1.0 で追加 12.1 は「㋿」のためだけに 5/7 にリリース http://unicode.org/versions/Unicode12.1.0/ Unicode 12.1

    adds exactly one character, for a total of 137,929 characters. The new character added to Version 12.1 is: U+32FF SQUARE ERA NAME REIWA Version 12.1 adds that single character to enable software to be rapidly updated to support the new Japanese era name in calendrical systems and date formatting. The new Japanese era name was officially announced on April 1, 2019, and is effective as of May 1, 2019. 34
  13. utf8mb4_ utf8mb4_ja ja_0900_as_cs _0900_as_cs utf8mb4_ utf8mb4_ja ja_0900_as_cs_ _0900_as_cs_ks ks 要素

    意味 utf8mb4 4バイトUTF-8 ja 言語 0900 Unicode 9.0.0 as アクセント違いは別の文字 cs 大文字小文字は別の文字 ks 平仮名と片仮名は別の文字 40
  14. 比較 ai_ci as_ci as_cs ja as_cs ja as_cs_ks bin A=a

    ◯ ◯ × × × × A=A ◯ ◯ × ◯ ◯ × A=a ◯ ◯ × × × × あ=ぁ ◯ ◯ × × × × あ=ア ◯ ◯ × ◯ × × は=ば=ぱ ◯ × × × × × 1=① ◯ ◯ × × × × 令=令 ◯ ◯ ◯ × × × 令= ◯ ◯ ◯ ◯ ◯ × 平成=㍻ ◯ ◯ × × × × 42
  15. ソート順もJIS ソート順もJIS mysql> select c,hex(c) from t order by c;

    +------+--------+ | c | hex(c) | +------+--------+ | 亜 | E4BA9C | | 伊 | E4BC8A | | 宇 | E5AE87 | | 栄 | E6A084 | | 奥 | E5A5A5 | +------+--------+ 43
  16. 長音記号のソート順は前の文字の母音と同じ 長音記号のソート順は前の文字の母音と同じ mysql> select c from t2 order by c;

    +--------+ | c | +--------+ | かー | | かあ | | かい | | きあ | | きー | | きい | | くあ | | くい | | くー | +--------+ 44
  17. CollationのPAD属性 CollationのPAD属性 8.0 から追加 PAD SPACE - 末尾空白文字の有無を無視する 5.7までの振る舞い NO

    PAD - 末尾空白文字の有無を無視しない 8.0からの新しいCollation utf8mb4_*0900_* 48
  18. PAD SPACE と NO PAD PAD SPACE と NO PAD

    mysql> set names utf8mb4 collate utf8mb4_unicode_520_ci; mysql> select 'a' = 'a '; +--------------+ | 'a' = 'a ' | +--------------+ | 1 | +--------------+ mysql> set names utf8mb4 collate utf8mb4_0900_ai_ci; mysql> select 'a' = 'a '; +--------------+ | 'a' = 'a ' | +--------------+ | 0 | +--------------+ 49
  19. utf8mb4_bin と utf8mb4_0900_bin utf8mb4_bin と utf8mb4_0900_bin mysql> set names utf8mb4

    collate utf8mb4_bin; mysql> select 'a' = 'a '; +--------------+ | 'a' = 'a ' | +--------------+ | 1 | +--------------+ mysql> set names utf8mb4 collate utf8mb4_0900_bin; mysql> select 'a' = 'a '; +--------------+ | 'a' = 'a ' | +--------------+ | 0 | +--------------+ 51
  20. 名前がイマイチな気がする 名前がイマイチな気がする 0900 は Unicode 9.0.0 準拠のCollationという意味 utf8mb4_0900_bin は Unicode

    準拠じゃない NO PADなCollationは0900だけだからこうなった? それにしてもなー 52