Избор на колацията за базата данни - вариант I
22-12-2009
Забелязвам, че във форума често има въпроси за това защо излизат въпросителни знаци или маймунки като изкарваме резултатите от базата данни. Точно затова реших да напиша два урока как да изберем колация, така че да не се получава този неприятен проблем с въпросителните знаци. В първата част ще обясня как се използва cp1251_bulgarian_ci, а във втората utf8_unicode_ci (по-добрият вариант според мен).

ВАЖНО: Двата урока работят безотказно САМО и ЕДИНСТВЕНО ако още в самото създаване на сайта и базата данни се спазват следните стъпки. Ако са вкарани резултати в базата данни под различен encoding тогава показаните методи в двата урока не е сигурно, че ще работят коректно.

Първото, което трябва да направим е да създадем базата данни и после да направим една таблица в нея. Тук е и първият важен момент. Като създаваме базата данни трябва да изберем колация cp1251_bulgarian_ci. Трябва да изглежда като на тази картинка:



Ако се пропусне тази стъпка ще трябва при създаването на всяка отделна таблица да и сменяме колацията на cp1251_bulgarian_ci, което не е чак толкова приятна работа.
След като сме създали базата данни трябва да създадем една примерна таблица. В моя урок това ще е таблицата my_table и ще съдържа само две полета id и title:

create table my_table(
id tinyint unsigned auto_increment primary key,
title varchar(255)
)




Ще вкараме няколко записа в базата данни, за да има какво да тестваме

INSERT INTO `my_table` (`id`, `title`) VALUES
(1, 'Заглавие 1'),
(2, 'Заглавие 2'),
(3, 'Заглавие 3'),
(4, 'Title 4'),
(5, 'Title 5'),
(6, 'Title 6'),
(7, 'Title 6');


След като сме създали базата данни трябва да направим и един файл с meta таг
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />


index.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Тест на windows-1251</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</head>
<body>
<p>Някакъв текст за тест</p>
</body>
</html>


ВАЖНО: Ако използваме колация на базата данни cp1251_bulgarian_ci ЗАДЪЛЖИТЕЛНО meta charset трябва да е windows-1251

Това е обикновена страничка, в която както виждате нямаме проблем с кирилицата. Сега нека изкараме резултатите от базата данни. Това ще стане като след <p>Някакъв текст за тест</p> добавим следния код:

<?php
$connect = mysql_connect("Хост", "Потребител", "Парола")
or die("Не може да свърже с базата данни");
mysql_select_db("my_database", $connect)
or die("Не може да селектира базата данни");
$result = mysql_query("SELECT title FROM my_table")
or die("Не може да изпълни заявката");
while($row = mysql_fetch_array($result)) {
echo $row['title']."<br />";
}
?>


Както виждате кирилицата сега не излиза. Тук идва и най-важният момент в урока. Трябва да добавим

mysql_query("SET CHARACTER SET cp1251");


непосредствено след
mysql_select_db("my_database", $connect)
or die("Не може да селектира базата данни");


и кодът ни ще изглежда по този начин:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Тест на windows-1251</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
</head>
<body>
<p>Някакъв текст за тест</p>
<?php
$connect = mysql_connect("localhost", "root", "")
or die("Не може да свърже с базата данни");
mysql_select_db("my_database", $connect)
or die("Не може да селектира базата данни");
mysql_query("SET CHARACTER SET cp1251");
$result = mysql_query("SELECT title FROM my_table")
or die("Не може да изпълни заявката");
while($row = mysql_fetch_array($result)) {
echo $row['title']."<br />";
}
?>
</body>
</html>


ВАЖНО: Винаги когато използваме колация cp1251_bulgarian_ci след селектирането на базата данни трябва да добавим и този ред mysql_query("SET CHARACTER SET cp1251"); . Независимо дали ще изкарваме или вкарваме данни в таблицата трябва да напишем тази заявка!

Ето така създадохме сайт и съответната му база данни без никакви проблеми с колацията. Най-важно е да се запомни:
I. При създаването на базата данни трябва да се използва encoding cp1251_bulgarian_ci
II. Файлът трябва да има <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
III. След като направим връзката към базата данни и я селектираме трябва да добавим този ред ЗАДЪЛЖИТЕЛНО:
mysql_query("SET CHARACTER SET cp1251");

Файл от урока

Виж вариант II


/ Трябва да сте регистриран за да напишете коментар /