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

Функция pg_client_encoding для работы с кодировками PostgreSQL
Раздел: Базы данных (PostgreSQL)
pg_client_encoding(?PgSql\Connection $connection = null): string

Основные сведения о функции

Функция pg_client_encoding() в PHP используется для получения или установки кодировки клиента при работе с базой данных PostgreSQL. Она позволяет определить текущую кодировку соединения или изменить её при необходимости.

Когда используется

Функция применяется в ситуациях, когда требуется:

  • Определить текущую кодировку соединения с PostgreSQL
  • Установить конкретную кодировку для корректной работы с данными
  • Решить проблемы с отображением символов, возникающие из-за несоответствия кодировок
Аргументы функции

Функция имеет один необязательный аргумент:

  • connection (ресурс) — идентификатор соединения с PostgreSQL. Если не указан, используется последнее открытое соединение.

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

Получение текущей кодировки
<?php
$conn = pg_connect('host=localhost dbname=test');
$encoding = pg_client_encoding($conn);
echo $encoding;
?>
UTF8
Установка новой кодировки
<?php
$conn = pg_connect('host=localhost dbname=test');
$result = pg_set_client_encoding($conn, 'WIN1251');
if ($result == 0) {
    echo 'Кодировка установлена';
}
?>
Кодировка установлена
Работа без указания соединения
<?php
$conn1 = pg_connect('host=localhost dbname=test1');
$conn2 = pg_connect('host=localhost dbname=test2');
// Вернёт кодировку для $conn2 (последнее соединение)
echo pg_client_encoding();
?>
UTF8

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

Используется для установки кодировки клиента. Работает в паре с pg_client_encoding(), которая только читает текущее значение.

iconv и mbstring функции

Функции iconv() и mb_convert_encoding() преобразуют строки между кодировками на уровне приложения, а не на уровне соединения с БД.

Предпочтения

pg_client_encoding() применяется для диагностики и управления кодировкой на уровне соединения. Функции преобразования строк используются для обработки конкретных данных.

Аналоги в других языках

Python (psycopg2)
import psycopg2
conn = psycopg2.connect('dbname=test')
# Получение кодировки
encoding = conn.encoding
print(encoding)
# Установка кодировки
conn.encoding = 'WIN1251'
UTF8
Node.js (pg)
const { Client } = require('pg');
const client = new Client();
await client.connect();
// Кодировка обычно задаётся в строке подключения
// или через SET client_encoding TO 'UTF8'

Pg client encoding в MySQL

В MySQL используются команды SET NAMES или SET CHARACTER SET для управления кодировкой соединения.

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

Несуществующее соединение
<?php
$encoding = pg_client_encoding(null);
var_dump($encoding);
?>
bool(false)
Некорректная кодировка при установке
<?php
$conn = pg_connect('host=localhost dbname=test');
$result = pg_set_client_encoding($conn, 'UNKNOWN_ENCODING');
echo $result;
?>
-1
Работа с закрытым соединением
<?php
$conn = pg_connect('host=localhost dbname=test');
pg_close($conn);
$encoding = pg_client_encoding($conn);
var_dump($encoding);
?>
bool(false)

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

В PHP 8.0 функция получила строгую типизацию. Аргумент connection теперь ожидается как ресурс (PgSql\Connection) или null. Возвращаемый тип — string|false.

В PHP 7.0 и 8.0 не было значительных изменений в поведении, но улучшена обработка ошибок при неверных параметрах.

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

Автоматическое определение и преобразование
Пример php
<?php
function convert_to_utf8($conn, $data) {
    $current = pg_client_encoding($conn);
    if ($current !== 'UTF8') {
        // Преобразование данных
        $data = iconv($current, 'UTF-8', $data);
    }
    return $data;
}
?>
Валидация поддерживаемых кодировок
Пример php
<?php
$conn = pg_connect('host=localhost dbname=test');
$supported = ['UTF8', 'WIN1251', 'LATIN1'];
$current = pg_client_encoding($conn);

if (!in_array($current, $supported)) {
    pg_set_client_encoding($conn, 'UTF8');
}
?>
Логирование изменений кодировки
Пример php
<?php
class EncodingManager {
    private $conn;
    private $log = [];
    
    public function __construct($connection) {
        $this->conn = $connection;
    }
    
    public function setEncoding($encoding) {
        $old = pg_client_encoding($this->conn);
        $result = pg_set_client_encoding($this->conn, $encoding);
        if ($result === 0) {
            $this->log[] = date('Y-m-d H:i:s') . 
                ': Изменена кодировка с ' . $old . ' на ' . $encoding;
        }
        return $result;
    }
}
?>
Обработка мультибайтовых строк
Пример php
<?php
$conn = pg_connect('host=localhost dbname=test');
pg_set_client_encoding($conn, 'SJIS');

$query = 'SELECT text_data FROM documents';
$result = pg_query($conn, $query);

while ($row = pg_fetch_assoc($result)) {
    // Конвертация в UTF-8 для отображения
    $text = mb_convert_encoding($row['text_data'], 'UTF-8', 'SJIS');
    echo $text;
}
?>

PHP pg_client_encoding function comments

En
Pg client encoding Get the client encoding