Pg set client encoding: примеры (PHP)

Работа с pg_set_client_encoding в PHP: полное руководство
Раздел: Базы данных (PostgreSQL)
pg_set_client_encoding(PgSql\Connection $connection, string $encoding): int

Функция pg_set_client_encoding

Функция pg_set_client_encoding устанавливает кодировку клиента для соединения с базой данных PostgreSQL. Её использование необходимо при работе с данными в различных кодировках для корректного отображения текстовой информации. Функция работает на уровне соединения и влияет на все последующие запросы в рамках этого соединения.

Аргументы функции
  • connection (ресурс) – идентификатор соединения с PostgreSQL. Если параметр не указан, используется последнее открытое соединение.
  • encoding (строка) – название кодировки, которую требуется установить. Возможные значения: SQL_ASCII, UTF8, EUC_JP, EUC_CN, EUC_KR, EUC_TW, ISO_8859_5, ISO_8859_6, ISO_8859_7, ISO_8859_8, KOI8, WIN, ALT, WIN1256, WIN1250, WIN1251 и другие, поддерживаемые PostgreSQL.

Функция возвращает 0 при успешном выполнении и -1 при ошибке.

Примеры использования

Установка кодировки UTF-8
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_set_client_encoding($conn, "UTF8");
if ($result === 0) {
    echo "Кодировка установлена успешно.";
} else {
    echo "Произошла ошибка.";
}
?>
Кодировка установлена успешно.
Использование без указания соединения
<?php
pg_connect("host=localhost dbname=test user=postgres");
$result = pg_set_client_encoding("WIN1251");
echo $result === 0 ? "Успешно" : "Ошибка";
?>
Успешно
Попытка установки неподдерживаемой кодировки
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_set_client_encoding($conn, "UNKNOWN_ENCODING");
echo $result === -1 ? "Ошибка установки кодировки." : "Успешно";
?>
Ошибка установки кодировки.

Альтернативные функции в PHP

В PHP существуют другие функции для работы с кодировками при взаимодействии с PostgreSQL. pg_client_encoding возвращает текущую кодировку клиента без возможности изменения. Эта функция полезна для получения информации о текущих настройках. SET NAMES в SQL-запросе выполняет аналогичную задачу, но на уровне SQL. Прямое использование SQL-команды позволяет менять кодировку в рамках транзакции.

Сравнение подходов

Функция pg_set_client_encoding является предпочтительной для явного управления кодировкой на уровне PHP-кода. SQL-команда SET NAMES может быть использована в сложных сценариях, где требуется изменение кодировки в составе транзакции. Функция pg_client_encoding используется только для диагностики.

Альтернативы в других языках

Python с библиотекой psycopg2
import psycopg2
conn = psycopg2.connect("dbname=test user=postgres")
conn.set_client_encoding('UTF8')
print(conn.encoding)
UTF8
Node.js с модулем pg
const { Client } = require('pg');
const client = new Client();
await client.connect();
await client.query("SET client_encoding TO 'UTF8'");
console.log('Кодировка установлена');
Кодировка установлена

Pg set client encoding в MySQL

SET NAMES utf8mb4;
Query OK, 0 rows affected (0.00 sec)

В отличие от PHP, в Python и Node.js управление кодировкой часто интегрировано в объекты соединения. В MySQL используется SQL-команда SET NAMES, которая меняет кодировку соединения аналогично PostgreSQL.

Типичные ошибки

Передача неверного типа аргумента
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$result = pg_set_client_encoding($conn, null);
var_dump($result);
?>
int(-1)
Использование функции без установленного соединения
<?php
$result = pg_set_client_encoding("UTF8");
var_dump($result);
?>
Warning: pg_set_client_encoding(): No PostgreSQL link opened yet in ...
bool(false)
Установка кодировки после выполнения запросов
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "INSERT INTO users (name) VALUES ('Иван')");
pg_set_client_encoding($conn, "UTF8");
$res = pg_query($conn, "SELECT name FROM users");
$row = pg_fetch_assoc($res);
echo $row['name'];
?>
Иван (может отображаться некорректно, если первоначальная кодировка была другой)

Ошибки часто возникают при попытке изменить кодировку после выполнения запросов или при использовании неподдерживаемых значений.

Изменения в версиях PHP

В PHP 8.0 функция pg_set_client_encoding была перенесена из стандартного расширения pgsql в расширение pgsql, которое теперь всегда доступно при сборке с поддержкой PostgreSQL. Сигнатура функции осталась неизменной. В PHP 8.1 улучшена обработка ошибок при передаче неверных параметров. В ранних версиях PHP функция могла возвращать false при ошибке, теперь возвращает -1 для сохранения обратной совместимости.

Расширенные примеры

Динамическое определение кодировки
Пример php
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
$encoding = mb_detect_encoding(file_get_contents('data.txt'), ['UTF-8', 'Windows-1251'], true);
if ($encoding === 'UTF-8') {
    pg_set_client_encoding($conn, "UTF8");
} elseif ($encoding === 'Windows-1251') {
    pg_set_client_encoding($conn, "WIN1251");
}
?>
Кодировка установлена в зависимости от содержимого файла.
Обработка ошибок с исключениями
Пример php
<?php
function setPgEncoding($conn, $encoding) {
    $result = pg_set_client_encoding($conn, $encoding);
    if ($result === -1) {
        throw new Exception("Не удалось установить кодировку: " . pg_last_error($conn));
    }
    return true;
}
try {
    $conn = pg_connect("host=localhost dbname=test user=postgres");
    setPgEncoding($conn, "UTF8");
    echo "Успешно";
} catch (Exception $e) {
    echo $e->getMessage();
}
?>
Успешно
Использование в классе-обёртке для работы с БД
Пример php
<?php
class PostgreSQLConnection {
    private $conn;
    public function __construct($params) {
        $this->conn = pg_connect($params);
    }
    public function setEncoding($encoding) {
        if (pg_set_client_encoding($this->conn, $encoding) === -1) {
            throw new RuntimeException('Ошибка установки кодировки');
        }
    }
    public function getEncoding() {
        return pg_client_encoding($this->conn);
    }
}
$db = new PostgreSQLConnection("host=localhost dbname=test user=postgres");
$db->setEncoding('KOI8');
echo $db->getEncoding();
?>
KOI8
Смена кодировки в транзакции
Пример php
<?php
$conn = pg_connect("host=localhost dbname=test user=postgres");
pg_query($conn, "BEGIN");
pg_set_client_encoding($conn, "WIN1251");
pg_query($conn, "INSERT INTO logs (message) VALUES ('Сообщение в WIN1251')");
pg_set_client_encoding($conn, "UTF8");
pg_query($conn, "INSERT INTO logs (message) VALUES ('Сообщение в UTF8')");
pg_query($conn, "COMMIT");
?>
Данные записаны в разных кодировках в рамках одной транзакции.

PHP pg_set_client_encoding function comments

En
Pg set client encoding Set the client encoding