๐Ÿ˜ก Emoji์™€ MySQL Collate

๋ฐฐ์ฃผ์›…ยท2020๋…„ 4์›” 12์ผ
1

ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” MySQL 5.7.27 ๋ฒ„์ „์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚œ ํ‰์†Œ์— ์ด๋ชจ์ง€๋ฅผ ์ž์ฃผ ์“ด๋‹ค ๐Ÿค–. ๋‚ด๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋ธ”๋กœ๊ทธ ์ œ๋ชฉ์ฒ˜๋Ÿผ, ํŠนํžˆ ์ œ๋ชฉ์— ์ฃผ๋กœ ๋ถ™ํ˜€์„œ ์“ฐ๊ณค ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์ด๋ชจ์ง€๋ผ๋Š” ์นœ๊ตฌ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ ๋งŒ๋‚˜๋ฉด ๊ณจ์น˜ ์•„ํ”„๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ตœ๊ทผ ๊ณจ์น˜ ์•„ํŒ ๋˜ ๊ฒฝํ—˜๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ ์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ๋Š” ๋Œ€๊ฐœ UTF-8์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, UTF-8์€ ์œ„ํ‚คํ”ผ๋””์•„์— ๋”ฐ๋ฅด๋ฉด 1~4๋ฐ”์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฌธ์žํ˜• ํ‘œํ˜„ ๋ฐฉ์‹์ด๋‹ค. ๋ฌธ์ œ๋Š” MySQL์ด utf8 ์ธ์ฝ”๋”ฉ์„ MySQL์—์„œ 3๋ฐ”์ดํŠธ์งœ๋ฆฌ ๊ฐ€๋ณ€ ์ธ์ž๋กœ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•œ๋‹ค. ๐Ÿคฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ์ธ์ฝ”๋”ฉ์ด utf8mb4 ์ด๊ณ , ๋Œ€๊ฐœ ์ด๋ชจ์ง€ ๊ด€๋ จํ•œ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ ๋œ๋‹ค.

๋‚ด๊ฐ€ ๋งˆ์ฃผํ•œ ๋ฌธ์ œ๋Š” ์ด๊ฒƒ๊ณผ ์กฐ๊ธˆ ๋‹ฌ๋ž๋‹ค. ์–ด์ฉŒ๋‹ค๋ณด๋‹ˆ ์ด๋ชจ์ง€๊ฐ€ ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ์ฟผ๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ, ์ด๋ชจ์ง€ '๋งŒ' ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ์ฟผ๋ฆฌํ•  ๋•Œ์— ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ row๊ฐ€ ์žˆ๋Š” ํ•„๋“œ์—์„œ, title์ด ๐Ÿค” ์ธ Row๋งŒ ์ฟผ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ฐ›์•„์˜ค๊ณ  ์‹ถ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ธ๊ณ , ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค

SELECT * FROM collate_test WHERE title='๐Ÿค”';

๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค. ํ•˜๋‚˜๋งŒ ๋ฆฌํ„ด๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ชจ์ง€์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋ชจ๋“  row๊ฐ€ ๋ฐ˜ํ™˜๋˜์—ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹คํ–‰ํ•˜๋ฉด ์ด๋ชจ์ง€ 2๊ฐœ์ธ ๋ชจ๋“  row๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

SELECT * FROM collate_test WHERE title='๐Ÿค–๐Ÿ';

MySQL์—๋Š” ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ์†์„ฑ์ด ํฌ๊ฒŒ character set๊ณผ collation์ด ์žˆ๋Š”๋ฐ, utf8mb4์˜ ๊ธฐ๋ณธ collation์ด utf8mb4_general_ci, case-insentive collation์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ด๋‹ค.

MySQL์˜ collation์ด๋ž€ ๋ฌธ์ž์—ด์„ mysql์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋ ค ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์„ค์ •์ด๋‹ค. ์ด๋ฅผ ci (case-insentive) ๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฌธ์ž์—ด์„ binary ๊ทธ๋Œ€๋กœ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ๋‚˜๋ฆ„์˜ ๊ทœ์น™์„ ์„ธ์›Œ ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค.

๋ฌธ์ œ๋Š” ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” utf8mb4_general_ci๋‚˜ utf8mb4_unicode_ci ๋ชจ๋‘ ์ด๋ชจ์ง€๋ฅผ ๊ฐ™์€ ๋ฌธ์ž๋กœ ๊ฐ€์ •ํ•˜๊ณ  ๋น„๊ตํ•˜๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์ฒ˜๋Ÿผ ์ด๋ชจ์ง€๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์˜ ๊ฒฝ์šฐ, ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ๊ฐ™์€ ๋ชจ๋“  ๋ฌธ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ SQL๋‹จ์—์„œ ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ collate๋ฅผ utf8mb4_bin ์œผ๋กœ ๋ณ€๊ฒฝํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

ALTER TABLE collate_test
    CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

์ดํ›„ ์ •์ƒ์ ์œผ๋กœ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

SELECT * FROM collate_test WHERE title='๐Ÿค”';

์ฟผ๋ฆฌ์—์„œ๋งŒ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๋งŒ์ผ ์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ emoji๊ฐ€ ํฌํ•จ๋œ ์ฟผ๋ฆฌ์— Unique๋ฅผ ๊ฑธ ์ผ์ด ์ƒ๊ธด๋‹ค๋ฉด ์‚ฌ์ „์— ์˜ค์ž‘๋™์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. collate ๊ธฐ์ค€์„ ์ด์šฉํ•˜์—ฌ unique ํ•œ์ง€ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

profile
๊ณต๋ถ€ํ•˜์ž ๋จน๊ณ ์‚ด์ž ์˜ค๋Š˜๋„ ๋ฐฉ์‹ค๋ฐฉ์‹ค ๋ฐ์€ ๋Œ€ํ•œ๋ฏผ๊ตญ์˜ ํ•˜๋Š˜

2๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2020๋…„ 12์›” 30์ผ

์ข‹์€ ํฌ์ŠคํŒ… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ €๋„ ์‚ฌ์ดํŠธ ํ”„๋กœ์ ํŠธ ํ•˜๋ฉด์„œ ์ด๋ชจ์ง€๋กœ๋งŒ ์ด๋ฃจ์–ด์ง„ ์นผ๋Ÿผ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด์ƒํ•˜๊ฒŒ ์ค‘๋ณต ์˜ค๋ฅ˜๊ฐ€ ๋œจ๋”๋ผ๊ณ ์š”. ๋•๋ถ„์— ํ•ด๊ฒฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 2์›” 27์ผ

์˜ค์šฐ, ์•„์ง ๊ฒช์ง€๋Š” ์•Š์•˜์ง€๋งŒ collation ๊ด€๋ จํ•ด์„œ ๊ฒ€์ƒ‰ํ•˜๋‹ค๊ฐ€ ์ข‹์€ ์ •๋ณด ์•Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ