MySQL Character Set 과 utf8mb4

Last Updated on 1월 14, 2021 by 태랑(정현호)



1. MySQL Charset/Collation



먼저 character Set 은 문자와 Encoding의 집합 이고, Collation은 Character 간의 정렬을 의미 합니다.


1.1 사용 가능한 모든 character set

- 8.0.22 버전 기준
mysql> show character set;
또는 mysql> SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS;

+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| binary   | Binary pseudo charset           | binary              |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_0900_ai_ci  |      4 |
+----------+---------------------------------+---------------------+--------+



1.2 모든 Collation 정보

mysql> show collation;
또는 mysql> SELECT * FROM INFORMATION_SCHEMA.COLLATIONS;

+--------------------------+----------+-----+---------+----------+---------+
| Collation                | Charset  | Id  | Default | Compiled | Sortlen |
+--------------------------+----------+-----+---------+----------+---------+
| big5_chinese_ci          | big5     |   1 | Yes     | Yes      |       1 |
| big5_bin                 | big5     |  84 |         | Yes      |       1 |
| dec8_swedish_ci          | dec8     |   3 | Yes     | Yes      |       1 |
| dec8_bin                 | dec8     |  69 |         | Yes      |       1 |
| cp850_general_ci         | cp850    |   4 | Yes     | Yes      |       1 |
| cp850_bin                | cp850    |  80 |         | Yes      |       1 |
| hp8_english_ci           | hp8      |   6 | Yes     | Yes      |       1 |
| hp8_bin                  | hp8      |  72 |         | Yes      |       1 |
| koi8r_general_ci         | koi8r    |   7 | Yes     | Yes      |       1 |
| koi8r_bin                | koi8r    |  74 |         | Yes      |       1 |
| latin1_german1_ci        | latin1   |   5 |         | Yes      |       1 |
| latin1_swedish_ci        | latin1   |   8 | Yes     | Yes      |       1 |
| latin1_danish_ci         | latin1   |  15 |         | Yes      |       1 |
| latin1_german2_ci        | latin1   |  31 |         | Yes      |       2 |
| latin1_bin               | latin1   |  47 |         | Yes      |       1 |
| latin1_general_ci        | latin1   |  48 |         | Yes      |       1 |
| latin1_general_cs        | latin1   |  49 |         | Yes      |       1 |
| latin1_spanish_ci        | latin1   |  94 |         | Yes      |       1 |
| latin2_czech_cs          | latin2   |   2 |         | Yes      |       4 |
| latin2_general_ci        | latin2   |   9 | Yes     | Yes      |       1 |
| latin2_hungarian_ci      | latin2   |  21 |         | Yes      |       1 |
| latin2_croatian_ci       | latin2   |  27 |         | Yes      |       1 |
| latin2_bin               | latin2   |  77 |         | Yes      |       1 |
| swe7_swedish_ci          | swe7     |  10 | Yes     | Yes      |       1 |
| swe7_bin                 | swe7     |  82 |         | Yes      |       1 |
| ascii_general_ci         | ascii    |  11 | Yes     | Yes      |       1 |
| ascii_bin                | ascii    |  65 |         | Yes      |       1 |
| ujis_japanese_ci         | ujis     |  12 | Yes     | Yes      |       1 |
| ujis_bin                 | ujis     |  91 |         | Yes      |       1 |
| sjis_japanese_ci         | sjis     |  13 | Yes     | Yes      |       1 |
| sjis_bin                 | sjis     |  88 |         | Yes      |       1 |
| hebrew_general_ci        | hebrew   |  16 | Yes     | Yes      |       1 |
| hebrew_bin               | hebrew   |  71 |         | Yes      |       1 |
| tis620_thai_ci           | tis620   |  18 | Yes     | Yes      |       4 |
| tis620_bin               | tis620   |  89 |         | Yes      |       1 |
| euckr_korean_ci          | euckr    |  19 | Yes     | Yes      |       1 |
| euckr_bin                | euckr    |  85 |         | Yes      |       1 |
| koi8u_general_ci         | koi8u    |  22 | Yes     | Yes      |       1 |
| koi8u_bin                | koi8u    |  75 |         | Yes      |       1 |
| gb2312_chinese_ci        | gb2312   |  24 | Yes     | Yes      |       1 |
| gb2312_bin               | gb2312   |  86 |         | Yes      |       1 |
| greek_general_ci         | greek    |  25 | Yes     | Yes      |       1 |
| greek_bin                | greek    |  70 |         | Yes      |       1 |
| cp1250_general_ci        | cp1250   |  26 | Yes     | Yes      |       1 |
| cp1250_czech_cs          | cp1250   |  34 |         | Yes      |       2 |
| cp1250_croatian_ci       | cp1250   |  44 |         | Yes      |       1 |
| cp1250_bin               | cp1250   |  66 |         | Yes      |       1 |
| cp1250_polish_ci         | cp1250   |  99 |         | Yes      |       1 |
| gbk_chinese_ci           | gbk      |  28 | Yes     | Yes      |       1 |
| gbk_bin                  | gbk      |  87 |         | Yes      |       1 |
| latin5_turkish_ci        | latin5   |  30 | Yes     | Yes      |       1 |
| latin5_bin               | latin5   |  78 |         | Yes      |       1 |
| armscii8_general_ci      | armscii8 |  32 | Yes     | Yes      |       1 |
| armscii8_bin             | armscii8 |  64 |         | Yes      |       1 |
| utf8_general_ci          | utf8     |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8     |  83 |         | Yes      |       1 |
| utf8_unicode_ci          | utf8     | 192 |         | Yes      |       8 |
| utf8_icelandic_ci        | utf8     | 193 |         | Yes      |       8 |
| utf8_latvian_ci          | utf8     | 194 |         | Yes      |       8 |
| utf8_romanian_ci         | utf8     | 195 |         | Yes      |       8 |
| utf8_slovenian_ci        | utf8     | 196 |         | Yes      |       8 |
| utf8_polish_ci           | utf8     | 197 |         | Yes      |       8 |
| utf8_estonian_ci         | utf8     | 198 |         | Yes      |       8 |
| utf8_spanish_ci          | utf8     | 199 |         | Yes      |       8 |
| utf8_swedish_ci          | utf8     | 200 |         | Yes      |       8 |
| utf8_turkish_ci          | utf8     | 201 |         | Yes      |       8 |
| utf8_czech_ci            | utf8     | 202 |         | Yes      |       8 |
| utf8_danish_ci           | utf8     | 203 |         | Yes      |       8 |
| utf8_lithuanian_ci       | utf8     | 204 |         | Yes      |       8 |
| utf8_slovak_ci           | utf8     | 205 |         | Yes      |       8 |
| utf8_spanish2_ci         | utf8     | 206 |         | Yes      |       8 |
| utf8_roman_ci            | utf8     | 207 |         | Yes      |       8 |
| utf8_persian_ci          | utf8     | 208 |         | Yes      |       8 |
| utf8_esperanto_ci        | utf8     | 209 |         | Yes      |       8 |
| utf8_hungarian_ci        | utf8     | 210 |         | Yes      |       8 |
| utf8_sinhala_ci          | utf8     | 211 |         | Yes      |       8 |
| utf8_german2_ci          | utf8     | 212 |         | Yes      |       8 |
| utf8_croatian_ci         | utf8     | 213 |         | Yes      |       8 |
| utf8_unicode_520_ci      | utf8     | 214 |         | Yes      |       8 |
| utf8_vietnamese_ci       | utf8     | 215 |         | Yes      |       8 |
| utf8_general_mysql500_ci | utf8     | 223 |         | Yes      |       1 |
| ucs2_general_ci          | ucs2     |  35 | Yes     | Yes      |       1 |
| ucs2_bin                 | ucs2     |  90 |         | Yes      |       1 |
| ucs2_unicode_ci          | ucs2     | 128 |         | Yes      |       8 |
| ucs2_icelandic_ci        | ucs2     | 129 |         | Yes      |       8 |
| ucs2_latvian_ci          | ucs2     | 130 |         | Yes      |       8 |
| ucs2_romanian_ci         | ucs2     | 131 |         | Yes      |       8 |
| ucs2_slovenian_ci        | ucs2     | 132 |         | Yes      |       8 |
| ucs2_polish_ci           | ucs2     | 133 |         | Yes      |       8 |
| ucs2_estonian_ci         | ucs2     | 134 |         | Yes      |       8 |
| ucs2_spanish_ci          | ucs2     | 135 |         | Yes      |       8 |
| ucs2_swedish_ci          | ucs2     | 136 |         | Yes      |       8 |
| ucs2_turkish_ci          | ucs2     | 137 |         | Yes      |       8 |
| ucs2_czech_ci            | ucs2     | 138 |         | Yes      |       8 |
| ucs2_danish_ci           | ucs2     | 139 |         | Yes      |       8 |
| ucs2_lithuanian_ci       | ucs2     | 140 |         | Yes      |       8 |
| ucs2_slovak_ci           | ucs2     | 141 |         | Yes      |       8 |
| ucs2_spanish2_ci         | ucs2     | 142 |         | Yes      |       8 |
| ucs2_roman_ci            | ucs2     | 143 |         | Yes      |       8 |
| ucs2_persian_ci          | ucs2     | 144 |         | Yes      |       8 |
| ucs2_esperanto_ci        | ucs2     | 145 |         | Yes      |       8 |
| ucs2_hungarian_ci        | ucs2     | 146 |         | Yes      |       8 |
| ucs2_sinhala_ci          | ucs2     | 147 |         | Yes      |       8 |
| ucs2_german2_ci          | ucs2     | 148 |         | Yes      |       8 |
| ucs2_croatian_ci         | ucs2     | 149 |         | Yes      |       8 |
| ucs2_unicode_520_ci      | ucs2     | 150 |         | Yes      |       8 |
| ucs2_vietnamese_ci       | ucs2     | 151 |         | Yes      |       8 |
| ucs2_general_mysql500_ci | ucs2     | 159 |         | Yes      |       1 |
| cp866_general_ci         | cp866    |  36 | Yes     | Yes      |       1 |
| cp866_bin                | cp866    |  68 |         | Yes      |       1 |
| keybcs2_general_ci       | keybcs2  |  37 | Yes     | Yes      |       1 |
| keybcs2_bin              | keybcs2  |  73 |         | Yes      |       1 |
| macce_general_ci         | macce    |  38 | Yes     | Yes      |       1 |
| macce_bin                | macce    |  43 |         | Yes      |       1 |
| macroman_general_ci      | macroman |  39 | Yes     | Yes      |       1 |
| macroman_bin             | macroman |  53 |         | Yes      |       1 |
| cp852_general_ci         | cp852    |  40 | Yes     | Yes      |       1 |
| cp852_bin                | cp852    |  81 |         | Yes      |       1 |
| latin7_estonian_cs       | latin7   |  20 |         | Yes      |       1 |
| latin7_general_ci        | latin7   |  41 | Yes     | Yes      |       1 |
| latin7_general_cs        | latin7   |  42 |         | Yes      |       1 |
| latin7_bin               | latin7   |  79 |         | Yes      |       1 |
| utf8mb4_general_ci       | utf8mb4  |  45 | Yes     | Yes      |       1 |
| utf8mb4_bin              | utf8mb4  |  46 |         | Yes      |       1 |
| utf8mb4_unicode_ci       | utf8mb4  | 224 |         | Yes      |       8 |
| utf8mb4_icelandic_ci     | utf8mb4  | 225 |         | Yes      |       8 |
| utf8mb4_latvian_ci       | utf8mb4  | 226 |         | Yes      |       8 |
| utf8mb4_romanian_ci      | utf8mb4  | 227 |         | Yes      |       8 |
| utf8mb4_slovenian_ci     | utf8mb4  | 228 |         | Yes      |       8 |
| utf8mb4_polish_ci        | utf8mb4  | 229 |         | Yes      |       8 |
| utf8mb4_estonian_ci      | utf8mb4  | 230 |         | Yes      |       8 |
| utf8mb4_spanish_ci       | utf8mb4  | 231 |         | Yes      |       8 |
| utf8mb4_swedish_ci       | utf8mb4  | 232 |         | Yes      |       8 |
| utf8mb4_turkish_ci       | utf8mb4  | 233 |         | Yes      |       8 |
| utf8mb4_czech_ci         | utf8mb4  | 234 |         | Yes      |       8 |
| utf8mb4_danish_ci        | utf8mb4  | 235 |         | Yes      |       8 |
| utf8mb4_lithuanian_ci    | utf8mb4  | 236 |         | Yes      |       8 |
| utf8mb4_slovak_ci        | utf8mb4  | 237 |         | Yes      |       8 |
| utf8mb4_spanish2_ci      | utf8mb4  | 238 |         | Yes      |       8 |
| utf8mb4_roman_ci         | utf8mb4  | 239 |         | Yes      |       8 |
| utf8mb4_persian_ci       | utf8mb4  | 240 |         | Yes      |       8 |
| utf8mb4_esperanto_ci     | utf8mb4  | 241 |         | Yes      |       8 |
| utf8mb4_hungarian_ci     | utf8mb4  | 242 |         | Yes      |       8 |
| utf8mb4_sinhala_ci       | utf8mb4  | 243 |         | Yes      |       8 |
| utf8mb4_german2_ci       | utf8mb4  | 244 |         | Yes      |       8 |
| utf8mb4_croatian_ci      | utf8mb4  | 245 |         | Yes      |       8 |
| utf8mb4_unicode_520_ci   | utf8mb4  | 246 |         | Yes      |       8 |
| utf8mb4_vietnamese_ci    | utf8mb4  | 247 |         | Yes      |       8 |
| cp1251_bulgarian_ci      | cp1251   |  14 |         | Yes      |       1 |
| cp1251_ukrainian_ci      | cp1251   |  23 |         | Yes      |       1 |
| cp1251_bin               | cp1251   |  50 |         | Yes      |       1 |
| cp1251_general_ci        | cp1251   |  51 | Yes     | Yes      |       1 |
| cp1251_general_cs        | cp1251   |  52 |         | Yes      |       1 |
| utf16_general_ci         | utf16    |  54 | Yes     | Yes      |       1 |
| utf16_bin                | utf16    |  55 |         | Yes      |       1 |
| utf16_unicode_ci         | utf16    | 101 |         | Yes      |       8 |
| utf16_icelandic_ci       | utf16    | 102 |         | Yes      |       8 |
| utf16_latvian_ci         | utf16    | 103 |         | Yes      |       8 |
| utf16_romanian_ci        | utf16    | 104 |         | Yes      |       8 |
| utf16_slovenian_ci       | utf16    | 105 |         | Yes      |       8 |
| utf16_polish_ci          | utf16    | 106 |         | Yes      |       8 |
| utf16_estonian_ci        | utf16    | 107 |         | Yes      |       8 |
| utf16_spanish_ci         | utf16    | 108 |         | Yes      |       8 |
| utf16_swedish_ci         | utf16    | 109 |         | Yes      |       8 |
| utf16_turkish_ci         | utf16    | 110 |         | Yes      |       8 |
| utf16_czech_ci           | utf16    | 111 |         | Yes      |       8 |
| utf16_danish_ci          | utf16    | 112 |         | Yes      |       8 |
| utf16_lithuanian_ci      | utf16    | 113 |         | Yes      |       8 |
| utf16_slovak_ci          | utf16    | 114 |         | Yes      |       8 |
| utf16_spanish2_ci        | utf16    | 115 |         | Yes      |       8 |
| utf16_roman_ci           | utf16    | 116 |         | Yes      |       8 |
| utf16_persian_ci         | utf16    | 117 |         | Yes      |       8 |
| utf16_esperanto_ci       | utf16    | 118 |         | Yes      |       8 |
| utf16_hungarian_ci       | utf16    | 119 |         | Yes      |       8 |
| utf16_sinhala_ci         | utf16    | 120 |         | Yes      |       8 |
| utf16_german2_ci         | utf16    | 121 |         | Yes      |       8 |
| utf16_croatian_ci        | utf16    | 122 |         | Yes      |       8 |
| utf16_unicode_520_ci     | utf16    | 123 |         | Yes      |       8 |
| utf16_vietnamese_ci      | utf16    | 124 |         | Yes      |       8 |
| utf16le_general_ci       | utf16le  |  56 | Yes     | Yes      |       1 |
| utf16le_bin              | utf16le  |  62 |         | Yes      |       1 |
| cp1256_general_ci        | cp1256   |  57 | Yes     | Yes      |       1 |
| cp1256_bin               | cp1256   |  67 |         | Yes      |       1 |
| cp1257_lithuanian_ci     | cp1257   |  29 |         | Yes      |       1 |
| cp1257_bin               | cp1257   |  58 |         | Yes      |       1 |
| cp1257_general_ci        | cp1257   |  59 | Yes     | Yes      |       1 |
| utf32_general_ci         | utf32    |  60 | Yes     | Yes      |       1 |
| utf32_bin                | utf32    |  61 |         | Yes      |       1 |
| utf32_unicode_ci         | utf32    | 160 |         | Yes      |       8 |
| utf32_icelandic_ci       | utf32    | 161 |         | Yes      |       8 |
| utf32_latvian_ci         | utf32    | 162 |         | Yes      |       8 |
| utf32_romanian_ci        | utf32    | 163 |         | Yes      |       8 |
| utf32_slovenian_ci       | utf32    | 164 |         | Yes      |       8 |
| utf32_polish_ci          | utf32    | 165 |         | Yes      |       8 |
| utf32_estonian_ci        | utf32    | 166 |         | Yes      |       8 |
| utf32_spanish_ci         | utf32    | 167 |         | Yes      |       8 |
| utf32_swedish_ci         | utf32    | 168 |         | Yes      |       8 |
| utf32_turkish_ci         | utf32    | 169 |         | Yes      |       8 |
| utf32_czech_ci           | utf32    | 170 |         | Yes      |       8 |
| utf32_danish_ci          | utf32    | 171 |         | Yes      |       8 |
| utf32_lithuanian_ci      | utf32    | 172 |         | Yes      |       8 |
| utf32_slovak_ci          | utf32    | 173 |         | Yes      |       8 |
| utf32_spanish2_ci        | utf32    | 174 |         | Yes      |       8 |
| utf32_roman_ci           | utf32    | 175 |         | Yes      |       8 |
| utf32_persian_ci         | utf32    | 176 |         | Yes      |       8 |
| utf32_esperanto_ci       | utf32    | 177 |         | Yes      |       8 |
| utf32_hungarian_ci       | utf32    | 178 |         | Yes      |       8 |
| utf32_sinhala_ci         | utf32    | 179 |         | Yes      |       8 |
| utf32_german2_ci         | utf32    | 180 |         | Yes      |       8 |
| utf32_croatian_ci        | utf32    | 181 |         | Yes      |       8 |
| utf32_unicode_520_ci     | utf32    | 182 |         | Yes      |       8 |
| utf32_vietnamese_ci      | utf32    | 183 |         | Yes      |       8 |
| binary                   | binary   |  63 | Yes     | Yes      |       1 |
| geostd8_general_ci       | geostd8  |  92 | Yes     | Yes      |       1 |
| geostd8_bin              | geostd8  |  93 |         | Yes      |       1 |
| cp932_japanese_ci        | cp932    |  95 | Yes     | Yes      |       1 |
| cp932_bin                | cp932    |  96 |         | Yes      |       1 |
| eucjpms_japanese_ci      | eucjpms  |  97 | Yes     | Yes      |       1 |
| eucjpms_bin              | eucjpms  |  98 |         | Yes      |       1 |
| gb18030_chinese_ci       | gb18030  | 248 | Yes     | Yes      |       2 |
| gb18030_bin              | gb18030  | 249 |         | Yes      |       1 |
| gb18030_unicode_520_ci   | gb18030  | 250 |         | Yes      |       8 |
+--------------------------+----------+-----+---------+----------+---------+



- 현재 서버 설정 내역 조회 명령어

mysql> SHOW VARIABLES WHERE VARIABLE_NAME LIKE '%coll%' 
OR VARIABLE_NAME LIKE '%char%' OR VARIABLE_NAME='init_connect';




2. Default Character Set



MySQL 의 Default Character Set는 버전별 차이가 나며 8.0.1 기준으로 latin1 에서 utf8mb4 로 변경 되었습니다

Character Set Support
Important Change: The default character set has changed from latin1 to utf8mb4. These system variables are affected:
  • The default value of the character_set_server and character_set_database system variables has changed from latin1 to utf8mb4.
  • The default value of the collation_server and collation_database system variables has changed from latin1_swedish_ci to utf8mb4_0900_ai_ci.


•5.6~ 5.7 까지의 default Character set latin1 이 었습니다
MySQL includes character set support that enables you to store data using a variety of character sets and perform comparisons according to a variety of collations. The default MySQL server character set and collation are latin1 and latin1_swedish_ci, but you can specify character sets at the server, database, table, column, and string literal levels.




3. MySQL Collation



Collation 은 Character 간의 정렬을 의미하며 Collation 은 크게 2가지로 나뉘게 됩니다.

• binary collation
   문자를 encoding된 바이너리 스트림 값으로 문자를 비교 하게 됩니다
   a 와 A 는 코드가 다르기 때문에 다른문자로 인식 됩니다.

• case-insensitive collation
   _ci 가 붙은 문자열 입니다(ex: utf8mb4_unicode_ci)
   1. 대문자 소문자를 같은 문자로 다루게 됩니다
   2. 이 후에 encoding 으로 비교 합니다.

_ci 에는 몇가지 종류가 있으며 여기서는 크게 2가지에 대해서 언급드리도록 하겠습니다.
(CI: case-insensitive:대소문자 구별하지 않는)

크게 general_ciunicode_ci 2가지로 구분할 수 있으며 보통 둘중 하나를 사용 합니다. 각 언어셋별 default collation 정보는 show character set 에서 확인 할 수 있습니다
(위에 기재되어 있음)

default collation 은 general 이 대부분이며 collation 별로 정렬의 기능의 차이와 속도의 차이가 발생하게 됩니다.

• general_ci
속도를 높이는데 중점이 되어 빠르며 일반적인 경우 사용되게 됩니다 general_ci 의 경우 ÀÁÅåāă 등 과 같이 accents 문자가 없어서 대해서 해당 단어의 대문자인 A로 치환/비교 되게 됩니다

• unicode_ci
유니코드 규칙을 기반으로 하여 정확한 정렬을 목표로 수행 됩니다


[참고] general_ci 와 unicode_ci 외 Collation 간의 속도 벤치마크
charset-and-collation-settings-impact-on-mysql-performance




4. utf8mb4



4.1 개요

UTF8 은 대부분 텍스트를 저장할 수 있는 자료형 문자 집합 입니다
 UTF8은 4(1~4)바이트 까지 저장되는 가변 바이트 구조 이고 MySQL 은 개발시 3바이트로 개발이 되었습니다 그에 따라 최근의 사용이 많아 진 4바이트 문자열인 Emoji 😄 는 기존 UTF8(3바이트)에 저장할수가 없었습니다 그래서 MySQL은 4바이트 UTF8 을 저장할 수 있는 자료형 문자 집합인 utf8mb4 케릭터셋이 기능 추가 되었습니다.
(MySQL 5.5.3)


[참고] Emoji 문자인 😄 를 입력하는 방법에는 스마트폰에서 입력하거나 맥OS 에서는 커맨드키 + 컨트롤키 + 스페이스 를 누르게 되면 아래와 같이 입력이 가능 합니다.

[참고] default-character-set 는 MySQL 5.5 버전 부터 deprecated 되었습니다.


4.2 파라미터 설정

utf8mb4 사용에 관한 설정은 아래와 같이 2개의 파라미터를 이용하시면 됩니다.

[mysqld]
character-set-server=utf8mb4

MySQL 5.7 기준
collation-server=utf8mb4_general_ci
또는
collation-server=utf8mb4_unicode_ci

MySQL 8.0 에서는
8.0 부터는 utf8mb4 의 default collation 은 utf8mb4_0900_ai_ci 입니다

• utf8mb4_0900_ai_ci
    유니코드 9.0 표현을 지원
    AI - Accent Insensitive : ÀÁÅåāă 등 과 같이 accents 지원
    CI - Case Insensitive : 대소문자 구별 안함




5. init-connect 설정



5.1 set names 설정

init-connect 파라미터는 클라이언트가 MySQL 서버와 connection이 맺어지면 init-connect 설정된 명령어 스크립트가 수행되게 됩니다 init-connect 에 보통 설정하는 내역이 케릭터셋과 Collation 이 보통 설정되며 아래의 2개의 내역이 주로 설정하여 사용하며 2개 케릭터셋 관련 설정은 몇개의 환경변수와 연결되어 있습니다

• SET NAMES 설정시
    아래3개의 변수가 같이 설정 됩니다

   설정 예시 : SET NAMES 'utf8mb4'
   character_set_client
   character_set_connection
   character_set_results

• SET collation_connection
   설정 예시 SET collation_connection='utf8mb4_unicode_ci'
   collation_connection 이 변경되게 됩니다.

• 다중 init-connect 사용시
    init-connect=SET NAMES 'utf8mb4'
    init-connect=SET collation_connection='utf8mb4_unicode_ci'

위와 같이 설정하게 되면 모두 적용되는게 아닌 마지막 init-connect 만 적용되게 됩니다. 만약 2개 이상의 명령어를 수행하고 싶으면 콤마나 공백 을 이용하면 됩니다


CONNECTION_ADMIN 권한 (또는 deprecate 된 SUPER 권한) 이 있는 사용자의 경우 init_connect의 내용이 실행되지 않으며 일반 유저에서만 init-connect 의 값이 적용 받습니다 이유는 init_connect의 잘못된 값에 의해서 모든 클라이언트의 연결 에 문제가 발생하지 않도록 하기 위해서 입니다 아래에서 확인 할 수 있지만 init_connect 에 구문 오류가있는 문이 포함되어있어 클라이언트 연결이 실패 하게 됩니다

이럴 경우 CONNECTION_ADMIN 또는 SUPER 권한이 있는 사용자가 접속을 하여 init_connect 값을 수정 하기 위함 입니다.


5.2 init-connect 테스트

• 현재 서버 설정값
    character-set-server = utf8

    collation-server = utf8_general_ci
 
• MySQL : 5.7.31


0) 현재 값 조회

mysql> SHOW VARIABLES WHERE VARIABLE_NAME LIKE '%coll%' 
OR VARIABLE_NAME LIKE '%char%' OR VARIABLE_NAME='init_connect';

+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
| collation_connection     | utf8_general_ci                  |
| collation_database       | utf8_general_ci                  |
| collation_server         | utf8_general_ci                  |
| init_connect             |                                  |
+--------------------------+----------------------------------+



1) 안되는 case

위에서(이전) 설명 한것 처럼 init_connect 항목을 여러개 지정하면 마지막에 설정한 내역이 반영되게 됩니다

init_connect = SET collation_connection = utf8mb4_unicode_ci
init_connect = SET NAMES utf8mb4

+--------------------------+------------------------------------+
| Variable_name            | Value                              |
+--------------------------+------------------------------------+
| character_set_client     | utf8mb4                            |
| character_set_connection | utf8mb4                            |
| character_set_database   | utf8                               |
| character_set_filesystem | binary                             |
| character_set_results    | utf8mb4                            |
| character_set_server     | utf8                               |
| character_set_system     | utf8                               |
| character_sets_dir       | /usr/local/mysql/share/charsets/   |
| collation_connection     | utf8mb4_general_ci                 |
| collation_database       | utf8_general_ci                    |
| collation_server         | utf8_general_ci                    |
| init_connect             | SET NAMES utf8mb4                  |
+--------------------------+------------------------------------+

SET NAMES utf8mb4 에 의해서 character_set_client, character_set_connection, character_set_results 은 변경이 있었으나 collation_connection 는 명시적인 설정이 되어 있지 않기 때문에 character_set_connection 의 default collation으로 설정되어 unicode_ci 가 아닌 general_ci 로 되었습니다

• MySQL 5.7 기준 utf8mb4 의 default 는 utf8mb4_general_ci 입니다.

+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
|                               <중략...>                                    |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
|                              <중략...>                                     |
+----------+---------------------------------+---------------------+--------+




• 아래 6개 중 4는 정상적으로 init-connect 이 수행되고 있으며, 2개는 정상 수행되지 않는 Case 입니다.


2) OK

init-connect=SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci'

+--------------------------+-------------------------------------+
| Variable_name            | Value                               |
+--------------------------+-------------------------------------+
| character_set_client     | utf8mb4                             |
| character_set_connection | utf8mb4                             |
| character_set_database   | utf8                                |
| character_set_filesystem | binary                              |
| character_set_results    | utf8mb4                             |
| character_set_server     | utf8                                |
| character_set_system     | utf8                                |
| character_sets_dir       | /usr/local/mysql/share/charsets/    |
| collation_connection     | utf8mb4_unicode_ci                  |
| collation_database       | utf8_general_ci                     |
| collation_server         | utf8_general_ci                     |
| init_connect             | SET NAMES 'utf8mb4'                 |
|                          | COLLATE 'utf8mb4_unicode_ci'        |
|                          |       ( 개행으로 편집된 표 입니다)        |
+--------------------------+-------------------------------------+



3) OK

init_connect='SET NAMES utf8mb4,collation_connection = utf8mb4_unicode_ci'

+--------------------------+--------------------------------------------+
| Variable_name            | Value                                      |
+--------------------------+--------------------------------------------+
| character_set_client     | utf8mb4                                    |
| character_set_connection | utf8mb4                                    |
| character_set_database   | utf8                                       |
| character_set_filesystem | binary                                     |
| character_set_results    | utf8mb4                                    |
| character_set_server     | utf8                                       |
| character_set_system     | utf8                                       |
| character_sets_dir       | /usr/local/mysql/share/charsets/           |
| collation_connection     | utf8mb4_unicode_ci                         |
| collation_database       | utf8_general_ci                            |
| collation_server         | utf8_general_ci                            |
| init_connect             | SET NAMES utf8mb4,                         |
|                          | collation_connection = utf8mb4_unicode_ci  |
|                          |           ( 개행으로 편집된 표 입니다)           |
+--------------------------+--------------------------------------------+



4) OK

init_connect=SET NAMES utf8mb4,collation_connection = utf8mb4_unicode_ci

+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | utf8mb4                                     |
| character_set_connection | utf8mb4                                     |
| character_set_database   | utf8                                        |
| character_set_filesystem | binary                                      |
| character_set_results    | utf8mb4                                     |
| character_set_server     | utf8                                        |
| character_set_system     | utf8                                        |
| character_sets_dir       | /usr/local/mysql/share/charsets/            |
| collation_connection     | utf8mb4_unicode_ci                          |
| collation_database       | utf8_general_ci                             |
| collation_server         | utf8_general_ci                             |
| init_connect             | SET NAMES utf8mb4,                          |
|                          | collation_connection = utf8mb4_unicode_ci   |
|                          |               ( 개행으로 편집된 표 입니다)        |
+--------------------------+---------------------------------------------+



5) OK

init_connect=SET NAMES 'utf8mb4',collation_connection = 'utf8mb4_unicode_ci'

+--------------------------+---------------------------------------------+
| Variable_name            | Value                                       |
+--------------------------+---------------------------------------------+
| character_set_client     | utf8mb4                                     |
| character_set_connection | utf8mb4                                     |
| character_set_database   | utf8                                        |
| character_set_filesystem | binary                                      |
| character_set_results    | utf8mb4                                     |
| character_set_server     | utf8                                        |
| character_set_system     | utf8                                        |
| character_sets_dir       | /usr/local/mysql/share/charsets/            |
| collation_connection     | utf8mb4_unicode_ci                          |
| collation_database       | utf8_general_ci                             |
| collation_server         | utf8_general_ci                             |
| init_connect             | SET NAMES 'utf8mb4',                        |
|                          | collation_connection = 'utf8mb4_unicode_ci' |
|                          |            (개행으로 편집된 표 입니다)            |
+--------------------------+---------------------------------------------+



6) NOT OK - 에러 발생

init-connect=SET NAMES 'utf8mb4';collation_connection='utf8mb4_unicode_ci'

repl_user@localhost:(none)> select version();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 6
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 6 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 7
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 7 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)
ERROR 1184 (08S01): Aborted connection 7 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)


7) NOT OK - 에러 발생
init-connect='SET NAMES utf8mb4;collation_connection=utf8mb4_unicode_ci'

repl_user@localhost:(none)> select version();
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 3
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 3 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect…
Connection id: 4
Current database: *** NONE ***

ERROR 1184 (08S01): Aborted connection 4 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)
ERROR 1184 (08S01): Aborted connection 4 to db: 'unconnected' user: 'repl_user' host: 'localhost' (init_connect command failed)


[참고] 클라이언트에 환경 변수등에 지정된 문자셋 대신 character_set_server 사용을 강제 하는 아래 2개 파라미터 지정을 하여도 init-connect 에 설정된 값을 따라서 케릭터셋과 collation 은 설정이 변경 됩니다.



Ref link
dev.mysql.com/5.6/charset.html
dev.mysql.com/5.7/charset.html
dev.mysql.com/8.0/charset.html
dev.mysql.com/8.0/charset-unicode-sets.html
dev.mysql.com/relnotes/news-8-0-1.html
dev.mysql.com/5.7/case-sensitivity.html
percona.com/collation-settings-mysql-performance



연관된 다른 글

 

 

 

 

 

 

 

답글 남기기