БпСстСтС 15% ΠΎΡ‚ всички хостинг услуги

ВСствай умСнията си ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠžΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° Π·Π° всСки хостинг ΠΏΠ»Π°Π½

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ
Заглавия
Администрация Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ

utf8 срСщу utf8mb4 Π² MySQL: ΠŸΡŠΠ»Π½ΠΎΡ‚ΠΎ тСхничСско Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ

MySQL's utf8 Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи Π΅ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π½Π°ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ β€” Ρ‚ΠΎΠΉ Π½Π΅ Π΅ истинска UTF-8 имплСмСнтация. Π’ΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€Π° символи, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ само 1 Π΄ΠΎ 3 Π±Π°ΠΉΡ‚Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΌΡŠΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎ изпуска ΠΈΠ»ΠΈ ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»Ρ всяка Unicode ΠΊΠΎΠ΄ΠΎΠ²Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π°Π΄ U+FFFF, Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ всички Π΅ΠΌΠΎΠ΄ΠΆΠΈ ΠΈ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° част ΠΎΡ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ CJK символи. utf8mb4 Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π°, пълна UTF-8 имплСмСнтация Π½Π° MySQL, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‰Π° 1 Π΄ΠΎ 4 Π±Π°ΠΉΡ‚Π° Π½Π° символ ΠΈ пълния Unicode Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½. Π—Π° всяка производствСна Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, създадСна слСд 2010 Π³., utf8mb4 Π΅ СдинствСният Ρ€Π°Π·ΡƒΠΌΠ΅Π½ ΠΈΠ·Π±ΠΎΡ€.

Π’ΠΎΠ²Π° Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ обяснява Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π°Ρ‰ΠΎ Ρ‚ΠΎΠ²Π° Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π΅ Π²Π°ΠΆΠ½ΠΎ, къдС оригиналният Π΄ΠΈΠ·Π°ΠΉΠ½ Π½Π° utf8 Π΅ ΡΠ³Ρ€Π΅ΡˆΠΈΠ», ΠΊΠ°ΠΊ Π΄Π° ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Ρ‚Π΅ бСзопасно ΠΈ ΠΊΠ°ΠΊ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ MySQL ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π½Π° Π½ΠΈΠ²ΠΎ ΡΡŠΡ€Π²ΡŠΡ€, Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ°.

ΠžΡΠ½ΠΎΠ²Π½ΠΈΡΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: Π—Π°Ρ‰ΠΎ MySQL's utf8 Π΅ счупСн ΠΏΠΎ Π΄ΠΈΠ·Π°ΠΉΠ½

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ΡŠΡ‚ Π·Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ UTF-8 (RFC 3629) Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° схСма с ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡˆΠΈΡ€ΠΈΠ½Π°, която ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° 1 Π΄ΠΎ 4 Π±Π°ΠΉΡ‚Π° Π·Π° прСдставянС Π½Π° всяка Π²Π°Π»ΠΈΠ΄Π½Π° Unicode ΠΊΠΎΠ΄ΠΎΠ²Π° Ρ‚ΠΎΡ‡ΠΊΠ° β€” Π½Π°Π΄ 1,1 ΠΌΠΈΠ»ΠΈΠΎΠ½Π° възмоТни символа. ΠšΠΎΠ³Π°Ρ‚ΠΎ MySQL въвСдС своя `utf8` Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи във вСрсия 4.1, имплСмСнтацията бСшС ΡƒΠΌΠΈΡˆΠ»Π΅Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° Π΄ΠΎ 3 Π±Π°ΠΉΡ‚Π° Π½Π° символ. Π’ΠΎΠ²Π° бСшС ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€Π΅Π½ компромис, Π° Π½Π΅ пропуск.

По ΠΎΠ½ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΡŠΡ‚ Π½Π° Ρ€Π΅Π΄ΠΎΠ²Π΅Ρ‚Π΅ Π² InnoDB налагашС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΎΡ‚ 767 Π±Π°ΠΉΡ‚Π° Π·Π° прСфикситС Π½Π° индСкснитС ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅. ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° 4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΈ символи Ρ‰Π΅ΡˆΠ΅ Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈ максималната дълТина Π½Π° индСксирания прСфикс Π·Π° `VARCHAR` ΠΊΠΎΠ»ΠΎΠ½ΠΈ, създавайки ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с индСксната ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚ 3 Π±Π°ΠΉΡ‚Π° бСшС ΠΏΡ€Π°Π³ΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ заобикалянС, ΠΊΠΎΠ΅Ρ‚ΠΎ сС ΠΏΡ€Π΅Π²ΡŠΡ€Π½Π° Π² Π΄ΡŠΠ»Π³ΠΎΡΡ€ΠΎΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ‚Π° послСдица: всяка Unicode ΠΊΠΎΠ΄ΠΎΠ²Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π² Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½Π°Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡ‡Π½Π° Ρ€Π°Π²Π½ΠΈΠ½Π° (SMP) β€” ΠΊΠΎΠ΄ΠΎΠ²ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ U+10000 ΠΈ ΠΏΠΎ-Π³ΠΎΡ€Π΅ β€” Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΡΡŠΡ…Ρ€Π°Π½Π΅Π½Π° Π² `utf8` ΠΊΠΎΠ»ΠΎΠ½Π°. Π’ΠΎΠ²Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π°:

  • Всички стандартни Π΅ΠΌΠΎΠ΄ΠΆΠΈ (U+1F600 ΠΈ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ)
  • ΠœΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΡ‡Π΅ΡΠΊΠΈ Π±ΡƒΠΊΠ²Π΅Π½ΠΎ-Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΈ символи (U+1D400–U+1D7FF)
  • Π‘ΠΈΠΌΠ²ΠΎΠ»ΠΈ Π·Π° ΠΌΡƒΠ·ΠΈΠΊΠ°Π»Π½Π° нотация
  • Π˜ΡΡ‚ΠΎΡ€ΠΈΡ‡Π΅ΡΠΊΠΈ писмСности ΠΊΠ°Ρ‚ΠΎ Linear B, готичСска ΠΈ клинопис
  • Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ CJK ΡƒΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ ΠΈΠ΄Π΅ΠΎΠ³Ρ€Π°Ρ„ΠΈ (U+20000–U+2A6DF)
  • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ символи Π½Π° Π²Π°Π»ΡƒΡ‚ΠΈ ΠΈ тСхничСски ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΈ, Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ Π² послСднитС вСрсии Π½Π° Unicode

ΠšΠΎΠ³Π°Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сС ΠΎΠΏΠΈΡ‚Π° Π΄Π° вмъкнС 4-Π±Π°ΠΉΡ‚ΠΎΠ² символ Π² `utf8` ΠΊΠΎΠ»ΠΎΠ½Π°, MySQL ΠΈΠ»ΠΈ Π²Ρ€ΡŠΡ‰Π° Π³Ρ€Π΅ΡˆΠΊΠ° `Incorrect string value`, ΠΈΠ»ΠΈ, Π°ΠΊΠΎ `sql_mode` Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅Π»Π΅Π½, ΠΌΡŠΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎ ΡΡŠΠΊΡ€Π°Ρ‰Π°Π²Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅. ΠœΡŠΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎΡ‚ΠΎ ΡΡŠΠΊΡ€Π°Ρ‰Π°Π²Π°Π½Π΅ Π΅ ΠΌΠΎΠΆΠ΅ Π±ΠΈ ΠΏΠΎ-опасният Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ β€” Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π³Ρ€Π΅ΡˆΠΊΠ°, Π½ΠΎ Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π²ΠΈ са ΠΏΠΎΠ²Ρ€Π΅Π΄Π΅Π½ΠΈ.

utf8mb4: ΠŸΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° имплСмСнтация

MySQL въвСдС utf8mb4 във вСрсия 5.5.3 (ΠΈΠ·Π΄Π°Π΄Π΅Π½Π° 2010 Π³.) спСциално Π·Π° Π΄Π° отстрани Ρ‚ΠΎΠ·ΠΈ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΠΊ. Π‘ΡƒΡ„ΠΈΠΊΡΡŠΡ‚ `mb4` ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° β€žΠΌΠ½ΠΎΠ³ΠΎΠ±Π°ΠΉΡ‚ΠΎΠ², максимум 4 Π±Π°ΠΉΡ‚Π°.” Π’ΠΎΠΉ Π΅ строго надмноТСство Π½Π° `utf8` β€” всСки символ, прСдставим Π² `utf8`, Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ прСдставим Π² `utf8mb4`. Няма Π·Π°Π³ΡƒΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΏΡ€ΠΈ ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ `utf8` към `utf8mb4`.

utf8mb4 сС ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π½Π° стандарта RFC 3629 UTF-8. Π’ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΏΡŠΠ»Π½ΠΎΡ‚ΠΎ Unicode ΠΊΠΎΠ΄ΠΎΠ²ΠΎ пространство ΠΎΡ‚ U+0000 Π΄ΠΎ U+10FFFF Π±Π΅Π· ограничСния.

utf8 срСщу utf8mb4: Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅

Ѐункцияutf8 (MySQL)utf8mb4
Π‘Π°ΠΉΡ‚ΠΎΠ²Π΅ Π½Π° символ1–31–4
Unicode ΠΏΠΎΠΊΡ€ΠΈΡ‚ΠΈΠ΅Π‘Π°ΠΌΠΎ BMP (U+0000–U+FFFF)Пълно (U+0000–U+10FFFF)
ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° СмодТиНСДа
Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ CJKНСДа
Π‘ΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с RFC 3629НСДа
МаксималСн индСксСн прСфикс (InnoDB, 4KB страници)767 Π±Π°ΠΉΡ‚Π°767 Π±Π°ΠΉΡ‚Π° (191 символа)
МаксималСн индСксСн прСфикс (innodb_large_prefix)3072 Π±Π°ΠΉΡ‚Π°3072 Π±Π°ΠΉΡ‚Π° (768 символа)
Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ спрямо latin1Π˜Π΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ Π·Π° ASCIIΠ˜Π΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ Π·Π° ASCII
ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π° Π½ΠΎΠ²ΠΈ проСктиНСДа
Π’ΡŠΠ²Π΅Π΄Π΅Π½Π° Π² MySQL вСрсия4.15.5.3

Π˜Π·Π±ΠΎΡ€ Π½Π° ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅ Π² utf8mb4

Π˜Π·Π±ΠΎΡ€ΡŠΡ‚ Π½Π° utf8mb4 ΠΊΠ°Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи Π΅ само ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°Ρ‚Π° ΠΎΡ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Π‘ΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅Ρ‚ΠΎ опрСдСля ΠΊΠ°ΠΊ сС сравняват, сортират ΠΈ индСксират Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅. Π“Ρ€Π΅ΡˆΠ½ΠΎΡ‚ΠΎ ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅ причинява Ρ„ΠΈΠ½ΠΎ, Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π·Π° отстраняванС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½Π° заявкитС.

utf8mb4_unicode_ci

Π‘Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΡŠΠΌΠ° Π·Π° Unicode ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅ (UCA). ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ Π΅Π·ΠΈΠΊΠΎΠ²ΠΎ-спСцифичнитС ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° сортиранС. Малко ΠΏΠΎ-Π±Π°Π²Π½ΠΎ ΠΎΡ‚ `utf8mb4_general_ci` ΠΏΠΎΡ€Π°Π΄ΠΈ ΠΏΠΎ-слоТна Π»ΠΎΠ³ΠΈΠΊΠ° Π·Π° сравнСниС, Π½ΠΎ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° Π² производитСлността Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° Π½Π° ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π΅Π½ Ρ…Π°Ρ€Π΄ΡƒΠ΅Ρ€.

utf8mb4_general_ci

ΠžΠΏΡ€ΠΎΡΡ‚Π΅Π½ΠΎ ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° напълно UCA. По-Π±ΡŠΡ€Π·ΠΎ Π² тСстовСтС ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° 2010-Ρ‚Π΅, Π½ΠΎ прСдимството Π² скоростта Π΅ Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π° ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈΡ‚Π΅ CPU. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° някои Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΈ случаи Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ нСмски символи ΠΊΠ°Ρ‚ΠΎ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΠΈ, ΠΊΠΎΠ³Π°Ρ‚ΠΎ Π½Π΅ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚. Π˜Π·Π±ΡΠ³Π²Π°ΠΉΡ‚Π΅ Π·Π° Π½ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ.

utf8mb4_0900_ai_ci

Налично Π² MySQL 8.0+. Π‘Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° Unicode 9.0 с нСчувствитСлно към ударСния (`ai`) ΠΈ нСчувствитСлно към Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π° (`ci`) сравнСниС. Π’ΠΎΠ²Π° Π΅ ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° MySQL 8.0 ΠΈ ΠΏΠΎ-Π½ΠΎΠ²ΠΈ вСрсии. Π’ΠΎ Π΅ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΎΡ‚ `utf8mb4_unicode_ci` ΠΈ ΠΏΠΎ-Ρ‚ΠΎΡ‡Π½ΠΎ.

utf8mb4_bin

Π”Π²ΠΎΠΈΡ‡Π½ΠΎ сравнСниС β€” чувствитСлно към Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°, чувствитСлно към ударСнията, Π±Π΅Π· спСцифични Π·Π° Π»ΠΎΠΊΠ°Π»Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅, ΠΊΠΎΠ³Π°Ρ‚ΠΎ сС Π½ΡƒΠΆΠ΄Π°Π΅Ρ‚Π΅ ΠΎΡ‚ Ρ‚ΠΎΡ‡Π½ΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ Π½Π° Π±Π°ΠΉΡ‚ΠΎΠ²ΠΎ Π½ΠΈΠ²ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° Ρ…Π΅ΡˆΠΎΠ²Π΅ Π½Π° ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΈ, чувствитСлни към Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€Π°.

ΠŸΡ€Π΅ΠΏΠΎΡ€ΡŠΠΊΠ°: Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ `utf8mb4_0900_ai_ci` Π½Π° MySQL 8.0+. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ `utf8mb4_unicode_ci` Π½Π° MySQL 5.7 ΠΈ ΠΏΠΎ-Ρ€Π°Π½Π½ΠΈ вСрсии.

ΠŸΠΎΡΠ»Π΅Π΄ΠΈΡ†ΠΈ Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈ индСкситС

ЧСста загриТСност ΠΏΡ€ΠΈ ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ utf8 към utf8mb4 Π΅ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° Π²ΡŠΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ:

  • ASCII символитС (U+0000–U+007F) всС ΠΎΡ‰Π΅ Π·Π°Π΅ΠΌΠ°Ρ‚ Ρ‚ΠΎΡ‡Π½ΠΎ 1 Π±Π°ΠΉΡ‚ ΠΈ Π² Π΄Π²Π΅Ρ‚Π΅ кодирания.
  • ΠŸΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ латински, Π³Ρ€ΡŠΡ†ΠΊΠΈ, кирилски, арабски ΠΈ СврСйски символи Π·Π°Π΅ΠΌΠ°Ρ‚ 2 Π±Π°ΠΉΡ‚Π° ΠΈ Π² Π΄Π²Π΅Ρ‚Π΅ кодирания.
  • CJK символитС Π² BMP Π·Π°Π΅ΠΌΠ°Ρ‚ 3 Π±Π°ΠΉΡ‚Π° ΠΈ Π² Π΄Π²Π΅Ρ‚Π΅ кодирания.
  • Π‘Π°ΠΌΠΎ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ символи (Π΅ΠΌΠΎΠ΄ΠΆΠΈ, Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ CJK) изискват 4 Π±Π°ΠΉΡ‚Π° β€” ΠΈ Ρ‚Π΅ просто Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ…Π° Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни Π² utf8 ΠΏΡ€Π΅Π΄ΠΈ.

Π Π΅Π°Π»Π½Π°Ρ‚Π° загриТСност Π·Π° индСкситС Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΎΡ‚ 767 Π±Π°ΠΉΡ‚Π° Π·Π° InnoDB индСксния прСфикс ΠΏΡ€ΠΈ ΠΏΠΎ-стари ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. Π‘ utf8mb4, ΠΏΡ€ΠΈ Π½Π°ΠΉ-лошия случай ΠΎΡ‚ 4 Π±Π°ΠΉΡ‚Π° Π½Π° символ, 191-символСн `VARCHAR` индСксСн прСфикс достига Ρ‚Π°Π²Π°Π½Π° ΠΎΡ‚ 767 Π±Π°ΠΉΡ‚Π°. Π‘ `utf8`, ΡΡŠΡ‰ΠΈΡΡ‚ Ρ‚Π°Π²Π°Π½ позволявашС 255 символа. Ако ΠΈΠΌΠ°Ρ‚Π΅ `VARCHAR(255)` ΠΊΠΎΠ»ΠΎΠ½ΠΈ с пълни индСкси Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° срСщнСтС Π³Ρ€Π΅ΡˆΠΊΠΈ `Specified key was too long` ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° миграцията.

РСшСния:

  • АктивирайтС `innodb_large_prefix = ON` (MySQL 5.6/5.7), Π·Π° Π΄Π° ΠΏΠΎΠ²ΠΈΡˆΠΈΡ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΄ΠΎ 3072 Π±Π°ΠΉΡ‚Π°.
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ `ROW_FORMAT=DYNAMIC` ΠΈΠ»ΠΈ `ROW_FORMAT=COMPRESSED` Π·Π° засСгнатитС Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ.
  • Π’ MySQL 8.0, `innodb_large_prefix` Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ΡŠΡ‚ Π΅ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚.
  • Π‘ΡŠΠΊΡ€Π°Ρ‚Π΅Ρ‚Π΅ индСкснитС прСфикси: `INDEX (column(191))` вмСсто `INDEX (column(255))`.

Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-чСстата Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° нСуспСх ΠΏΡ€ΠΈ миграция ΠΈ Ρ‚Π°Π·ΠΈ, която Π΅ Π½Π°ΠΉ-слабо Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½Π° Π² основнитС Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²Π°.

Как Π΄Π° ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Ρ‚Π΅ MySQL Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ utf8 към utf8mb4

ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ проста, Π½ΠΎ изисква прСцизност. ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈ Π΄Π° Π΅ Π½ΠΈΠ²ΠΎ β€” ΡΡŠΡ€Π²ΡŠΡ€, Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ»ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠ° β€” оставя ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π²ΠΈ ΠΌΡŠΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎ Π΄Π° сС Π²ΡŠΡ€Π½Π΅ към старото ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅.

Π‘Ρ‚ΡŠΠΏΠΊΠ° 1: АрхивирайтС Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ

Никога Π½Π΅ промСняйтС ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° символи Π² Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ Π±Π΅Π· Π²Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ Π°Ρ€Ρ…ΠΈΠ².

β€œ`bash

mysqldump -u username -p –single-transaction –routines –triggers

database_name > database_backup_$(date +%F).sql

β€œ`

Π€Π»Π°Π³ΡŠΡ‚ `–single-transaction` осигурява послСдоватСлна снимка Π·Π° InnoDB Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ Π±Π΅Π· Π·Π°ΠΊΠ»ΡŽΡ‡Π²Π°Π½Π΅. Π‘ΡŠΡ…Ρ€Π°Π½Π΅Ρ‚Π΅ Π°Ρ€Ρ…ΠΈΠ²Π° Π½Π° място, ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ ΠΎΡ‚ ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅.

Π‘Ρ‚ΡŠΠΏΠΊΠ° 2: АктуализирайтС конфигурацията Π½Π° MySQL ΡΡŠΡ€Π²ΡŠΡ€Π°

Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ `/etc/mysql/my.cnf` ΠΈΠ»ΠΈ `/etc/mysql/mysql.conf.d/mysqld.cnf` Π² зависимост ΠΎΡ‚ Π²Π°ΡˆΠ°Ρ‚Π° дистрибуция:

β€œ`ini

[client]

default-character-set = utf8mb4

[mysql]

default-character-set = utf8mb4

[mysqld]

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

For MySQL 5.6/5.7 only β€” remove on MySQL 8.0

innodb_large_prefix = ON

innodb_file_format = Barracuda

innodb_file_per_table = ON

β€œ`

РСстартирайтС MySQL:

β€œ`bash

sudo systemctl restart mysql

β€œ`

Π‘Ρ‚ΡŠΠΏΠΊΠ° 3: ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ

β€œ`sql

ALTER DATABASE database_name

CHARACTER SET = utf8mb4

COLLATE = utf8mb4_unicode_ci;

β€œ`

Π‘Ρ‚ΡŠΠΏΠΊΠ° 4: ΠšΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ всички Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ

Π“Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ `ALTER TABLE` ΠΈΠ·Ρ€Π°Π·ΠΈ Π·Π° всяка Ρ‚Π°Π±Π»ΠΈΡ†Π°. Π˜Π·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΈΠΌ Ρ€ΡŠΡ‡Π½ΠΎ ΠΏΡ€ΠΈ Π³ΠΎΠ»Π΅ΠΌΠΈ схСми Π΅ склонно към Π³Ρ€Π΅ΡˆΠΊΠΈ. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Ρ‚Π°Π·ΠΈ заявка Π·Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ€Π°Π·ΠΈΡ‚Π΅:

β€œ`sql

SELECT CONCAT(

'ALTER TABLE `', TABLE_NAME, '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'

)

FROM information_schema.TABLES

WHERE TABLE_SCHEMA = 'database_name'

AND TABLE_TYPE = 'BASE TABLE';

β€œ`

Π˜Π·ΠΏΡŠΠ»Π½Π΅Ρ‚Π΅ всСки Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½ ΠΈΠ·Ρ€Π°Π·. Π‘ΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡΡŠΡ‚ `CONVERT TO CHARACTER SET` промСня Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ стандарта Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΈ всички ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ символни ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π² Π΅Π΄Π½Π° опСрация.

Π‘Ρ‚ΡŠΠΏΠΊΠ° 5: ΠŸΠΎΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈΡ‚Π΅ Π² Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° индСкса

Ако срСщнСтС `Specified key was too long; max key length is 767 bytes`, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°ΠΉΡ‚Π΅ проблСмния индСкс:

β€œ`sql

β€” Change full-column index to prefix index

ALTER TABLE table_name DROP INDEX index_name;

ALTER TABLE table_name ADD INDEX index_name (column_name(191));

β€œ`

Π—Π° WordPress Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ, ΠΊΠΎΠ»ΠΎΠ½Π°Ρ‚Π° `option_name` Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° `wp_options` ΠΈ ΠΊΠΎΠ»ΠΎΠ½Π°Ρ‚Π° `meta_key` Π½Π° `wp_postmeta` са чСсти ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΡ†ΠΈ Π½Π° Ρ‚Π°Π·ΠΈ Π³Ρ€Π΅ΡˆΠΊΠ°.

Π‘Ρ‚ΡŠΠΏΠΊΠ° 6: ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ

β€œ`sql

β€” Check server-level variables

SHOW VARIABLES LIKE 'character_set%';

SHOW VARIABLES LIKE 'collation%';

β€” Check a specific table

SHOW CREATE TABLE table_nameG

β€” Check all columns in a database

SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME

FROM information_schema.COLUMNS

WHERE TABLE_SCHEMA = 'database_name'

AND DATA_TYPE IN ('char', 'varchar', 'text', 'tinytext', 'mediumtext', 'longtext');

β€œ`

Всяка стойност `CHARACTER_SET_NAME` трябва Π΄Π° ΠΏΠΎΠΊΠ°Π·Π²Π° `utf8mb4`.

Π‘Ρ‚ΡŠΠΏΠΊΠ° 7: АктуализирайтС Π½ΠΈΠ·ΠΎΠ²Π΅Ρ‚Π΅ Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

ΠšΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ схСмата Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° Π½ΠΈΡ‰ΠΎ, Π°ΠΊΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π²ΠΈ сС ΡΠ²ΡŠΡ€Π·Π²Π° с Π³Ρ€Π΅ΡˆΠ½ΠΈΡ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи. ΠšΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π½ΠΈΠ²ΠΎ Π²Ρ€ΡŠΠ·ΠΊΠ° замСства стандарта Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.

PHP (PDO):

β€œ`php

$dsn = 'mysql:host=localhost;dbname=database_name;charset=utf8mb4';

$pdo = new PDO($dsn, $user, $pass, [

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

]);

β€œ`

PHP (MySQLi):

β€œ`php

$mysqli = new mysqli('localhost', $user, $pass, $db);

$mysqli->set_charset('utf8mb4');

β€œ`

Python (mysql-connector-python):

β€œ`python

cnx = mysql.connector.connect(

host='localhost', user=user, password=pass,

database=db, charset='utf8mb4', collation='utf8mb4_unicode_ci'

)

β€œ`

Node.js (mysql2):

β€œ`javascript

const pool = mysql2.createPool({

host: 'localhost', user: user, password: pass,

database: db, charset: 'utf8mb4'

});

β€œ`

ΠΠ΅ΡƒΡΠΏΠ΅Ρ…ΡŠΡ‚ Π΄Π° сС Π·Π°Π΄Π°Π΄Π΅ Π½Π°Π±ΠΎΡ€ΡŠΡ‚ ΠΎΡ‚ символи Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π΅ СдинствСната Π½Π°ΠΉ-чСста ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΅ΠΌΠΎΠ΄ΠΆΠΈ Π΄Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠ°Π²Π°Ρ‚ Π΄Π° Π½Π΅ сС Π²ΠΌΡŠΠΊΠ²Π°Ρ‚ слСд ΠΏΡ€ΠΈΠ²ΠΈΠ΄Π½ΠΎ Π·Π°Π²ΡŠΡ€ΡˆΠ΅Π½Π° миграция.

Π‘ΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π½ΠΈ ΡΡŠΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π·Π° WordPress

WordPress ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° utf8mb4 ΠΊΠ°Ρ‚ΠΎ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ символи ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ вСрсия 4.2 (Π°ΠΏΡ€ΠΈΠ» 2015 Π³.). Ако ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ WordPress инсталация Π½Π° ΠΏΠΎ-стара Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, която Π½ΠΈΠΊΠΎΠ³Π° Π½Π΅ Π΅ ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Π½Π°, Ρ„Π°ΠΉΠ»ΡŠΡ‚ `wp-config.php` ΠΌΠΎΠΆΠ΅ всС ΠΎΡ‰Π΅ Π΄Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°:

β€œ`php

define('DB_CHARSET', 'utf8');

β€œ`

ΠŸΡ€ΠΎΠΌΠ΅Π½Π΅Ρ‚Π΅ Ρ‚ΠΎΠ²Π° Π½Π°:

β€œ`php

define('DB_CHARSET', 'utf8mb4');

define('DB_COLLATE', 'utf8mb4_unicode_ci');

β€œ`

WordPress ΡΡŠΡ‰ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π° Π²Π³Ρ€Π°Π΄Π΅Π½Π° Ρ€ΡƒΡ‚ΠΈΠ½Π° Π·Π° Π½Π°Π΄Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ (`maybe_convert_table_to_utf8mb4()`), която сС изпълнява ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° ядрото. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‚Π°Π·ΠΈ Ρ€ΡƒΡ‚ΠΈΠ½Π° Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΠ±Ρ…Π²Π°Ρ‰Π° всяка Ρ‚Π°Π±Π»ΠΈΡ†Π°, особСно Ρ‚Π΅Π·ΠΈ, създадСни ΠΎΡ‚ плъгини. Π ΡŠΡ‡Π½ΠΈΡΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ с `ALTER TABLE`, описан ΠΏΠΎ-Π³ΠΎΡ€Π΅, Π΅ ΠΏΠΎ-Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½.

Π’ срСда Π·Π° VPS Π₯остинг с root Π΄ΠΎΡΡ‚ΡŠΠΏ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ цСлия Ρ‚ΠΎΠ·ΠΈ процСс с shell скрипт ΠΈ Π΄Π° Π³ΠΎ ΠΏΠ»Π°Π½ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°Ρ‚ΠΎ Π΅Π΄Π½ΠΎΠΊΡ€Π°Ρ‚Π½Π° cron Π·Π°Π΄Π°Ρ‡Π°, Π΄Π°Π²Π°ΠΉΠΊΠΈ Π²ΠΈ пълСн ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π²ΡŠΡ€Ρ…Ρƒ Π²Ρ€Π΅ΠΌΠ΅Ρ‚ΠΎ ΠΈ рСгистриранСто.

Π‘ΡŠΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ Π·Π° производитСлността

Π’ΡŠΠ·Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ Π²ΡŠΡ€Ρ…Ρƒ производитСлността Π½Π° utf8mb4 спрямо utf8 Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π° ΠΏΠΎ-голямата част ΠΎΡ‚ натоварванията:

  • Заявки Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅: Няма ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΠΊΠ° Π·Π° BMP символи. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ символи изискват Π΅Π΄ΠΈΠ½ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π΅Π½ Π±Π°ΠΉΡ‚ I/O, ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΏΠΎΠ³Π»ΡŠΡ‰Π° ΠΎΡ‚ ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΎΡ‚ΠΎ Π² буфСрния ΠΏΡƒΠ».
  • Заявки Π·Π° запис: Π˜Π΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΈ Π·Π° ASCII ΠΈ BMP ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅. НСзначитСлно ΠΏΠΎ-високи Π·Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ символи.
  • ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с индСкси: НамалСната максимална дълТина Π½Π° прСфикса (191 срСщу 255 символа Π·Π° индСкси с пълна ΡˆΠΈΡ€ΠΈΠ½Π°) ΠΌΠΎΠΆΠ΅ Π΄Π° засСгнС ΠΏΠ»Π°Π½ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° заявкитС, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ индСкси Π½Π° пълни ΠΊΠΎΠ»ΠΎΠ½ΠΈ Π²ΡŠΡ€Ρ…Ρƒ дълги `VARCHAR` ΠΊΠΎΠ»ΠΎΠ½ΠΈ. ΠžΠ΄ΠΈΡ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ индСкситС си ΠΏΡ€Π΅Π΄ΠΈ ΠΈ слСд миграцията.
  • ΠŸΠ°ΠΌΠ΅Ρ‚: MySQL разпрСдСля Π±ΡƒΡ„Π΅Ρ€ΠΈ с фиксирана ΡˆΠΈΡ€ΠΈΠ½Π° Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π½ΠΈΠ·ΠΎΠ²Π΅ въз основа Π½Π° максималнитС Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ Π½Π° символ. ΠŸΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ utf8 (максимум 3 Π±Π°ΠΉΡ‚Π°) към utf8mb4 (максимум 4 Π±Π°ΠΉΡ‚Π°) ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π·Π° Π±ΡƒΡ„Π΅Ρ€ΠΈ Π·Π° сортиранС Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ с ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ 33% Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠ·ΠΎΠ²Π΅. На Dedicated Server с Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ RAM, Ρ‚ΠΎΠ²Π° Π΅ Π±Π΅Π· Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ срСда с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚, Π½Π°Π±Π»ΡŽΠ΄Π°Π²Π°ΠΉΡ‚Π΅ `sort_buffer_size` ΠΈ `tmp_table_size` слСд миграцията.

Кога utf8 всС ΠΎΡ‰Π΅ Π΅ ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ

Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° тСсСн Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½ΠΈ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΈ Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ `utf8`:

  • Π‘Ρ‚Ρ€ΠΎΠ³Π° ΡΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с наслСдСни систСми: ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰ΠΎ Π½Π΅ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ ORM ΠΈΠ»ΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ Π·Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° 4-Π±Π°ΠΉΡ‚ΠΎΠ²ΠΈ символи. Π’ΠΎΠ²Π° Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с тСхничСския дълг, Π° Π½Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΄Π° Π·Π°ΠΏΠ°Π·ΠΈΡ‚Π΅ utf8 Π·Π° Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅.
  • Π‘Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ само Π·Π° Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π·Π° Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€Π°Π½Π΅: Ако Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ Π½ΠΈΠΊΠΎΠ³Π° няма Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° Π½ΠΎΠ²ΠΈ записи ΠΈ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ Π½Π΅ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‚ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ символи, миграцията добавя риск Π±Π΅Π· ΠΏΠΎΠ»Π·Π°.
  • Π‘Ρ‚Ρ€ΠΎΠ³ΠΈ ограничСния Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅: Π’ ΠΊΡ€Π°ΠΉΠ½ΠΈ Π³Ρ€Π°Π½ΠΈΡ‡Π½ΠΈ случаи β€” Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ систСми ΠΈΠ»ΠΈ срСди с Ρ‚Π΅ΠΆΠΊΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ ΠΊΠ°ΠΏΠ°Ρ†ΠΈΡ‚Π΅Ρ‚ β€” ΠΏΡ€Π΅Π΄Π΅Π»Π½Π°Ρ‚Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° Π² ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° Π½Π΅ сС отнася Π·Π° никакъв стандартСн сцСнарий Π·Π° ΡƒΠ΅Π± хостинг.

Π’ΡŠΠ² всСки Π΄Ρ€ΡƒΠ³ случай utf8mb4 Π΅ правилният ΠΈΠ·Π±ΠΎΡ€. ΠΡ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΡŠΡ‚, Ρ‡Π΅ utf8 спСстява пространство Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅, Π΅ тСхничСски Π²Π΅Ρ€Π΅Π½ само Π·Π° Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ символи, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‚Π°ΠΊΠ° ΠΈΠ»ΠΈ ΠΈΠ½Π°Ρ‡Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ…Π° Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни Π² utf8. НС спСстяватС пространство Π·Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ…Ρ‚Π΅ Π΄Π° ΡΡŠΡ…Ρ€Π°Π½ΠΈΡ‚Π΅.

Π˜Π·Π±ΠΎΡ€ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° хостинг срСда Π·Π° MySQL utf8mb4

ΠŸΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° конфигурация Π½Π° utf8mb4 изисква Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ конфигурационния Ρ„Π°ΠΉΠ» Π½Π° MySQL ΡΡŠΡ€Π²ΡŠΡ€Π° (`my.cnf`). Π’ΠΎΠ²Π° ΠΈΠ·ΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ срСди Π·Π° сподСлСн хостинг, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° промСнятС ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΡΡŠΡ€Π²ΡŠΡ€.

Π—Π° пълСн ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π²ΡŠΡ€Ρ…Ρƒ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° символи Π² MySQL, ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅Ρ‚ΠΎ, настройкитС Π½Π° InnoDB ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°, Π²ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΈΠ»ΠΈ ΠΏΠ»Π°Π½ Π·Π° VPS Π₯остинг с root Π΄ΠΎΡΡ‚ΡŠΠΏ, ΠΈΠ»ΠΈ Dedicated Server. И Π΄Π²Π΅Ρ‚Π΅ Π²ΠΈ Π΄Π°Π²Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π΅Π½ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ `/etc/mysql/my.cnf`, Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° рСстартиратС MySQL услугата ΠΈ свободата Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ `innodb_large_prefix`, `ROW_FORMAT` ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ влияят Π½Π° успСха Π½Π° миграцията към utf8mb4.

Ако управляватС мноТСство Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ ΠΈΠ»ΠΈ клиСнтски сайтовС, VPS с cPanel прСдоставя Π³Ρ€Π°Ρ„ΠΈΡ‡Π΅Π½ интСрфСйс Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ ΡΡŠΡ‰Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΠ°Π·Π²Π° нСобходимия Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ основния ΡΡŠΡ€Π²ΡŠΡ€ Π·Π° конфигурация Π½Π° Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ символи. Π—Π° Π΅ΠΊΠΈΠΏΠΈ, ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‰ΠΈ Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚Ρ‚Π° Π½Π° командния Ρ€Π΅Π΄ с Π»Π΅ΠΊ ΠΏΠ°Π½Π΅Π», VPS ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ няколко Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ, подходящи Π·Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси.

Π—Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ, изискващи ΡΡŠΡ‰ΠΎ сигурно ΠΏΡ€Π΅Π΄Π°Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ, ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° миграцията Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ с ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ SSL сСртификат Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅, ΠΊΠΎΠ΄ΠΈΡ€Π°Π½ΠΈ с utf8mb4, са Π·Π°Ρ‰ΠΈΡ‚Π΅Π½ΠΈ ΠΏΡ€ΠΈ прСнос, Π° Π½Π΅ само Π² ΠΏΠΎΠΊΠΎΠΉ.

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ списък Π·Π° тСхничСски Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ списък ΠΏΡ€Π΅Π΄ΠΈ ΠΈ слСд всяка миграция ΠΎΡ‚ utf8 към utf8mb4:

ΠŸΡ€Π΅Π΄ΠΈ миграцията:

  • [ ] ПълСн `mysqldump` Π°Ρ€Ρ…ΠΈΠ², Π²Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ ΠΈ Π²ΡŠΠ·ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌ
  • [ ] ВСрсията Π½Π° MySQL ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Π½Π° (изисква сС 5.5.3+ Π·Π° utf8mb4)
  • [ ] Π‘Ρ‚Π°Ρ‚ΡƒΡΡŠΡ‚ Π½Π° `innodb_large_prefix` ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½ (Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΈ MySQL 5.6/5.7)
  • [ ] Всички `VARCHAR(255)` ΠΊΠΎΠ»ΠΎΠ½ΠΈ с индСкси Π½Π° пълни ΠΊΠΎΠ»ΠΎΠ½ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ
  • [ ] ΠšΠΎΠ΄ΡŠΡ‚ Π·Π° Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ символи Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°Π½ ΠΈ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½
  • [ ] ΠŸΠ»Π°Π½ΠΈΡ€Π°Π½ ΠΏΡ€ΠΎΠ·ΠΎΡ€Π΅Ρ† Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° производствСни Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ

Π‘Π»Π΅Π΄ миграцията:

  • [ ] `SHOW VARIABLES LIKE 'character_set%'` ΠΏΠΎΠΊΠ°Π·Π²Π° `utf8mb4` Π½Π° Π½ΠΈΠ²ΠΎ ΡΡŠΡ€Π²ΡŠΡ€
  • [ ] `SHOW CREATE TABLE` ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π°Π²Π° `utf8mb4` Π·Π° всички ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Π½ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†ΠΈ
  • [ ] Заявката `information_schema.COLUMNS` ΠΏΠΎΡ‚Π²ΡŠΡ€ΠΆΠ΄Π°Π²Π° липсата Π½Π° оставащи `utf8` ΠΊΠΎΠ»ΠΎΠ½ΠΈ
  • [ ] `SET NAMES utf8mb4` Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Π½ Π² ΠΊΠΎΠ΄Π° Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ°
  • [ ] Π’Π΅ΡΡ‚ΡŠΡ‚ Π·Π° вмъкванС Π½Π° Π΅ΠΌΠΎΠ΄ΠΆΠΈ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Ρ‚ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π½Π° прСдставитСлна Ρ‚Π°Π±Π»ΠΈΡ†Π°
  • [ ] Π‘Π°Π·ΠΎΠ²Π°Ρ‚Π° линия Π½Π° производитСлността Π½Π° заявкитС сравнСна с ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈ миграцията
  • [ ] Π”ΡŠΠ»ΠΆΠΈΠ½ΠΈΡ‚Π΅ Π½Π° индСкситС Π²Π΅Ρ€ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ β€” Π±Π΅Π· ΠΌΡŠΠ»Ρ‡Π°Π»ΠΈΠ²ΠΎ ΡΡŠΠΊΡ€Π°Ρ‰Π°Π²Π°Π½Π΅ Π½Π° дълги индСксирани стойности

Π§Π—Π’

ΠŸΡ€ΠΈΡ‡ΠΈΠ½ΡΠ²Π° Π»ΠΈ ΠΌΠΈΠ³Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ ΠΎΡ‚ utf8 към utf8mb4 Π·Π°Π³ΡƒΠ±Π° Π½Π° Π΄Π°Π½Π½ΠΈ?

НС. utf8mb4 Π΅ строго надмноТСство Π½Π° MySQL's utf8. ВсСки символ, ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ Π² utf8 ΠΊΠΎΠ»ΠΎΠ½Π°, Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎ прСдставим Π² utf8mb4. ΠœΠΈΠ³Ρ€Π°Ρ†ΠΈΡΡ‚Π° Π΅ Π½Π΅Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚Π΅Π»Π½Π° Π·Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ. ЕдинствСният риск са Π³Ρ€Π΅ΡˆΠΊΠΈ Π² Π΄ΡŠΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π½Π° индСкса ΠΏΡ€ΠΈ `VARCHAR(255)` ΠΊΠΎΠ»ΠΎΠ½ΠΈ с индСкси Π½Π° пълни ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈ Ρ‡Ρ€Π΅Π· ΡΡŠΠΊΡ€Π°Ρ‰Π°Π²Π°Π½Π΅ Π½Π° индСксния прСфикс.

Π—Π°Ρ‰ΠΎ Π΅ΠΌΠΎΠ΄ΠΆΠΈ всС ΠΎΡ‰Π΅ Π½Π΅ сС Π²ΠΌΡŠΠΊΠ²Π°Ρ‚ слСд ΠΊΠ°Ρ‚ΠΎ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Ρ… Ρ‚Π°Π±Π»ΠΈΡ†ΠΈΡ‚Π΅ си към utf8mb4?

Най-чСстата ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π° Π΅ Π½Π°Π±ΠΎΡ€ΡŠΡ‚ ΠΎΡ‚ символи Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ. Ако Π²Π°ΡˆΠΈΡΡ‚ PHP, Python ΠΈΠ»ΠΈ Node.js ΠΊΠΎΠ΄ сС ΡΠ²ΡŠΡ€Π·Π²Π° Π±Π΅Π· ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ ΡƒΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° `utf8mb4`, MySQL ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° стандарта `character_set_client` Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π·Π° Ρ‚Π°Π·ΠΈ сСсия. Π”ΠΎΠ±Π°Π²Π΅Ρ‚Π΅ `SET NAMES utf8mb4` ΠΈΠ»ΠΈ СквивалСнтния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚ΡŠΡ€ Π·Π° Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ символи към конфигурацията Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° Π²Ρ€ΡŠΠ·ΠΊΠ°.

Каква Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ utf8mb4_unicode_ci ΠΈ utf8mb4_0900_ai_ci?

`utf8mb4_unicode_ci` Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π·Π° ΡΡŠΠΏΠΎΡΡ‚Π°Π²ΡΠ½Π΅ Π½Π° Unicode 4.0 ΠΈ Π΅ стандартният ΠΈΠ·Π±ΠΎΡ€ Π·Π° MySQL 5.7. `utf8mb4_0900_ai_ci` Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ΠΎ Π½Π° Unicode 9.0, Π΅ стандартното Π² MySQL 8.0 ΠΈ Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎ-Π±ΡŠΡ€Π·ΠΎ ΠΈ ΠΏΠΎ-Π΅Π·ΠΈΠΊΠΎΠ²ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ `utf8mb4_0900_ai_ci` Π½Π° MySQL 8.0+ Π·Π° Π½ΠΎΠ²ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ.

Π©Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ Π»ΠΈ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅Ρ‚ΠΎ към utf8mb4 Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π½Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ ΠΌΠΈ?

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, Π½Π΅. ASCII ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ BMP символи ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΡΡŠΡ‰ΠΈΡ Π±Ρ€ΠΎΠΉ Π±Π°ΠΉΡ‚ΠΎΠ²Π΅ ΠΈ Π² Π΄Π²Π΅Ρ‚Π΅ кодирания. Π‘Π°ΠΌΠΎ Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈΡ‚Π΅ символи (Π΅ΠΌΠΎΠ΄ΠΆΠΈ, Π΄ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΈ CJK) ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ 4 Π±Π°ΠΉΡ‚Π° β€” ΠΈ Ρ‚Π΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ…Π° Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ прСдставСни Π² utf8 ΠΏΡ€Π΅Π΄ΠΈ. Π”ΠΎΠΏΡŠΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎΡ‚ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° Π·Π° Π±ΡƒΡ„Π΅Ρ€ΠΈ Π·Π° сортиранС сС ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° с ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ 33% Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΈΠ·ΠΎΠ²Π΅, Π½ΠΎ Ρ‚ΠΎΠ²Π° Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π½Π° всСки ΡΡŠΠ²Ρ€Π΅ΠΌΠ΅Π½Π΅Π½ ΡΡŠΡ€Π²ΡŠΡ€.

Мога Π»ΠΈ Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΌ utf8mb4 Π½Π° сподСлСн хостинг?

Частично. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ символи Π½Π° Π½ΠΈΠ²ΠΎ Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ SQL `ALTER` ΠΈΠ·Ρ€Π°Π·ΠΈ, ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡƒΠΊΠ°ΠΆΠ΅Ρ‚Π΅ Π½Π°Π±ΠΎΡ€Π° ΠΎΡ‚ символи Π² Π½ΠΈΠ·Π° Π·Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ `my.cnf` ΠΈΠ»ΠΈ Π΄Π° рСстартиратС MySQL Π½Π° сподСлСн хостинг. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΡ‚Π΅ Π½Π° Π½ΠΈΠ²ΠΎ ΡΡŠΡ€Π²ΡŠΡ€ Ρ‰Π΅ останат Π½Π΅ΠΏΡ€ΠΎΠΌΠ΅Π½Π΅Π½ΠΈ, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ Π½ΠΎΠ²ΠΈΡ‚Π΅ Π±Π°Π·ΠΈ Π΄Π°Π½Π½ΠΈ, създадСни Ρ‡Ρ€Π΅Π· ΠΏΠ°Π½Π΅Π»Π° Π·Π° хостинг, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ utf8 ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅. ΠŸΡŠΠ»Π½Π°Ρ‚Π° конфигурация Π½Π° utf8mb4 изисква VPS ΠΈΠ»ΠΈ dedicated ΡΡŠΡ€Π²ΡŠΡ€ с root Π΄ΠΎΡΡ‚ΡŠΠΏ.