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() будуть проігноровані, себто отримуємо подвійну незручність.

  1. 2 Responses to “PHP + MySQL charset”

  2. By Style)r on Oct 31, 2007 | Reply

    Привіт, додай значок рсс десь під категоріями, бо така важлива річ, а знаходиться в кінці сторінки

  3. By admin on Oct 31, 2007 | Reply

    в принципі якщо гугл рідер натравити на URL http://sergiy.vynnychenko.com/blog/ він і сам все знайде..

    але все ж просьбу виконаю ))

Post a Comment