Pg client encoding: примеры (PHP)
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() и mb_convert_encoding() преобразуют строки между кодировками на уровне приложения, а не на уровне соединения с БД.
pg_client_encoding() применяется для диагностики и управления кодировкой на уровне соединения. Функции преобразования строк используются для обработки конкретных данных.
Аналоги в других языках
import psycopg2
conn = psycopg2.connect('dbname=test')
# Получение кодировки
encoding = conn.encoding
print(encoding)
# Установка кодировки
conn.encoding = 'WIN1251'UTF8
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
function convert_to_utf8($conn, $data) {
$current = pg_client_encoding($conn);
if ($current !== 'UTF8') {
// Преобразование данных
$data = iconv($current, 'UTF-8', $data);
}
return $data;
}
?><?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
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
$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;
}
?>