PHP + MySQL charset
Posted on September 24th, 2007 | by Sergiy |На мій погляд основна складність в програмуванні для Web, полягає в тому, що середовище виконання програми утворюється із взаємодії багатьох модулів… звісно найбільшим каталізатором ентропії є велика різноманітність браузерів і їх версій, але навіть серверна частина містить багато підводного каміння.
Зараз я хотів би описати яким чином можна уникнути таких актуальних проблем із кодуванням. Прив’язуватись до конфігурації серверних програм (Apache, PHP, MySql) є ознакою поганого тону, тому я розгляну виключно ті питання, які стосуються написання коду.
Headers (заголовки)
Для HTML це задається наступним чином.
<html> <head> <meta content=“text/html; charset=utf-8″>
Але якщо цей HTML код згенерований PHP скрипом, то цього мало, оскільки в протоколі HTTP передбачений “невидимй заголовок” із більш високим пріоритетом. Для того щоб default_charset в php.ini не зіпсував нам життя, необхідно зробити наступне:
header(’Content-Type: text/html; charset=utf-8′);
і зробити це необхідно до того як клієнту почнуться відсилатись перші байти HTML.
MySQL
Перш за все необхідно правильно створити БД і таблиці. У випадку із БД використовуємо наступний шаблон
CREATE DATABASE cool_bd DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
але для того щоб не залежати від дефолтної конфігурації (наприклад якщо створювати БД через вебінтерфейс хостингу), варто завжди явно задавати параметри таблиць
CREATE TABLE IF NOT EXISTS categories
(
id int(10) unsigned NOT NULL auto_increment,
name varchar(30) not NULL,
PRIMARY KEY (id)
) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
Далі необхідно визначити кодування для взаємодії PHP і MySQL, для цього після з’єднання із БД необхідно зробити запит SET NAMES
mysql_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASS);
mysql_query(’SET NAMES “UTF8″‘);
mysql_select_db(MYSQL_DB, $this->con);
таким чином встановлюється кодування для character_set_client, character_set_connection і character_set_results.
Примітки
- Більш детальну інформацію по цьому питанню можна знайти за посиланям FAQ PHP MySQL charset. Особливо мене порадував розділ про те, як “відремонтувати” БД, що була зламана неправильними конфігураціями кодування.
- Для відладки HTTP заголовків існує плагін для Firefox Live HTTP Headers.
P.S.
Іще під кінець я хотів би описати одну небезпечну ситуацію. Наступний код містить помилку:
<?php
….
?>
Помилка полягає в тому що після тега “?> ” йдуть кілька символів “\n”. І якщо ви включите цей файл в свій код, він автоматично згенерує заголовок із стандартними налаштуваннями і всі наступні виклики header() будуть проігноровані, себто отримуємо подвійну незручність.
2 Responses to “PHP + MySQL charset”
By Style)r on Oct 31, 2007 | Reply
Привіт, додай значок рсс десь під категоріями, бо така важлива річ, а знаходиться в кінці сторінки
By admin on Oct 31, 2007 | Reply
в принципі якщо гугл рідер натравити на URL http://sergiy.vynnychenko.com/blog/ він і сам все знайде..
але все ж просьбу виконаю ))