Головна    Статті    Карта    Зв'язок   

Питання та відповіді щодо СКБД MYSQL.

Кракозябри, або невідповідність кодування (символи на сторінці Будівельні матеріали)

Напевно всі новачки зіштовхуються з проблемою кодування, в цьому розділі хотів би переглянути організацію кодування символів.


- Де переглянути документацію по кодуванню символів системи Бази Даних?
Звичайно на офіційному сайті http://dev.mysql.com


- Чому трапляються неправильне представлення даних (тіж самі кракозябри)?

Причиною тому служить невідповідність кодування елементів застосунків. Кодування може бути - cp1251, ascii, latin1, utf8 та інші.


- Що таке кодування даних?

КОДування — це промисловий стандарт, розроблений, щоб забезпечити цифрове представлення символів та спеціальних символів.

Якщо розглядати структуру сайту, що виконує транзакцію даних з Базою Даних, і на якійсь ділянці передачі даних трапиться інший тип кодування, то це може призвести до представлення інформації на екран глядача у вигляді незрозумілих символів.

Ближче до сервера Баз Даних:

- Які є інструмети для аналізу даних?

По-перше, ми можемо переглянути, як налаштований веб-сервер Бази Даних, застосувавши команду.

SHOW VARIABLES

Переглянути ближче до кодувань символів застосуємо команди:

show variables like "%character%";
show variables like "%collation%";

де,
Кодування (characher set) - набір символів, що використовуються.
Порівняння (collation) - набір правил для порівняння символів.


Результуючі вибірки в даному випадку можуть бути такого плану:

Variable_nameValue
character_set_clientutf8
character_set_connectionutf8
character_set_databasecp1251
character_set_filesystembinary
character_set_resultsutf8
character_set_servercp1251
character_set_systemutf8
character_sets_dir/usr/share/mysql/charsets/


Variable_nameValue
collation_connectionutf8_general_ci
collation_databasecp1251_general_ci
collation_servercp1251_general_ci


- Де зберігаються налаштування кодів систем Бази Даних?
конфігураційний файл- my.cnf (my.ini)


- Які саме елементи кодуються в системі Бази Даних?

Варто відмітити, що налаштування кодування можуть бути Global та Session.
Global - налаштування кодувань на стороні серверу, що йдуть "by default" за замовчуванням.
Session - налаштування кодувань лише на момент з'єднання з Базою Даних.

Кодування символів може бути реалізовано для:
-серверу,
-бази даних,
-таблиці,
-колонок таблиці

ФункціяПризначення
character_set_clientКодування для операторів, що приходять зі сторони клієнта
character_set_connectionКодування для літералів, що не мають пристрою введення символів а також для перетворення числових значень в строкові дані
character_set_databaseКодування, що використовується Базою Даних за замовчуванням.
character_set_resultsКодування, що встановлюється для результуючої вибірки даних
character_set_serverКодування для всього серверу
character_set_systemКодування, що використовує сервер для зберігання ідентифікаторів, завжди має значення = UTF8
      
collation_connectionПорівняння кодування з'єднання
collation_databaseПорівняння БД
collation_serverПорівняння за замовчуванням


- Яким чином змінити налаштування кодувань системи БД?
Виконавши запит:

SET NAMES ‘charset_name’ [COLLATE ‘collation_name’]

де, ‘charset_name’- тип необхідного кодування,

Параметр SET NAMES визначає в якому кодування буде відбуватись обмін інформацією між клієнтом-сервером. Особливість даного запиту, що він еквівалентний запитам.


SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

Для встановлення кодування Порівняння (colation_connection) відмінного від дефолтного, необхідно

SET NAMES x COLLATE y

поскільки нам потрібно кодування даних utf8 та її дефолтне Порівняння utf8_general_ci, запит буде мати вигляд:


SET NAMES utf8 COLLATE utf8_unicode_ci

- Як бути, коли немає прав на зміну типу кодувань даних БД?
Бувають ситуації, коли відсутні права на зміну типу кодувань БД, тобто зміна глобальних налаштувань приведе до некоректного відображення даних на інших сайтах.


тоді рішення буде встановити тип кодування лише для передачі даних та отримання даних від БД, застосувавши функцію mysqli_set_charset


Як приклад php-кодування, де дані будуть представлені в UTF08:


<?php
$con=mysqli_connect("localhost","my_user","my_password","my_db");

//Задаємо тип кодування з'єднання
mysqli_set_charset($con, "utf8");

$sql="SELECT * FROM Transit ";
if ($result=mysqli_query($con,$sql))
{
mysqli_data_seek($result,4);
$row=mysqli_fetch_row($result);
printf ("Date: %s Town_from: %s Town_to: %s Carrier: %s \n", $row[1], $row[2], $row[3], $row[4]);
mysqli_free_result($result);
}
mysqli_close($con);
?>