ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов

Π’ идСальном случаС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° символов Π΄ΠΎΠ»ΠΆΠ½Π° ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сСрвСра ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это согласно описанию Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β»Β ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ сСрвСра MySQL. Π’ качСствС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ MySQL API ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ для установки ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов Π²ΠΎ врСмя выполнСния.

ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π΅Ρ€Π΅ΠΆΠ΅Π½ΠΈΠ΅

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° символов ΠΈ экранированиС символов

ΠšΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° символов Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‡Ρ‘Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ влияСт Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ дСйствиС, Π² Ρ‚ΠΎΠΌ числС Π½Π° дСйствия с послСдствиями для бСзопасности. НапримСр, ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ экранирования (Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ mysqli_real_escape_string() для mysqli ΠΈ PDO::quote() для PDO_MySQL) зависят ΠΎΡ‚ этих настроСк. Π’Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ эти Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ символов ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΡƒΡŽ Π² запросС, Ρ‚Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ запросы Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ установки ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQL

<?php

$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

// Π­Ρ‚ΠΎΡ‚ запрос Π½Π΅ влияСт Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");

// И этот Π½Π΅ влияСт Π½Π° $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");

// Π½ΠΎ Π²ΠΎΡ‚ этот запрос повлияСт Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');

// Π° этот НЕ повлияСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ нСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ "-"
$mysqli->set_charset('UTF-8'); // (utf8mb4, Π° Π½Π΅ UTF-8)
?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Π½ΠΈΠΆΠ΅ Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΡƒ символов Π²ΠΎ врСмя выполнСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· API.

Π—Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ВозмоТная ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Π° с UTF-8
ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ символов Π² MySQL Π½Π΅ содСрТат Ρ‚ΠΈΡ€Π΅/дСфис, строка "utf8" примСняСтся Π² MySQL для установки ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ UTF-8 (Π΄ΠΎ 3 Π±Π°ΠΉΡ‚ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Unicode UTF-8). Π‘Ρ‚Ρ€ΠΎΠΊΠ° "UTF-8" Π½Π΅ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠ° ΠΈ выбросит ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ установкС ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #2 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установки ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов: mysqli

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

echo
'ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Π°Ρ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°: ' . $mysqli->character_set_name() . "\n";

if (!
$mysqli->set_charset('utf8mb4')) {
printf("Ошибка Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ utf8mb4: %s\n", $mysqli->error);
exit;
}

echo
'Π’Π°ΡˆΠ° тСкущая ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ°: ' . $mysqli->character_set_name() . "\n";
?>

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #3 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ установки ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΈ символов: pdo_mysql

<?php
$pdo
= new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>
οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 1 note

up
21
mkroese at eljakim dot nl ΒΆ
8 years ago
Please note that MySQL's utf8 encoding has a maximum of 3 bytes and is unable to encode *all* unicode characters.

If you need to encode characters beyond the BMP (Basic Multilingual Plane), like emoji or other special characters, you will need to use a different encoding like utf8mb4 or any other encoding supporting the higher planes. Mysql will discard any characters encoded in 4 bytes (or more).

See https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8mb4.html for more information on the matter