Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP从一个数据库读取数据并插入到另一个数据库时发生编码错误_Php_Postgresql_Utf 8_Character Encoding_Pervasive - Fatal编程技术网

使用PHP从一个数据库读取数据并插入到另一个数据库时发生编码错误

使用PHP从一个数据库读取数据并插入到另一个数据库时发生编码错误,php,postgresql,utf-8,character-encoding,pervasive,Php,Postgresql,Utf 8,Character Encoding,Pervasive,使用PHP,我试图从普适DB v9.5中读取数据,并将其插入Windows 2008上的PostgreSQL 9.3(编码:UTF-8)。我没有选择或编写PervisiveDB(我只是从中读取数据)。使用ODBC,我从普适数据库读取数据,并将其毫无问题地写入控制台。然而,当我尝试将其插入Postgre时,我遇到了 Warning: pg_execute(): Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0x94

使用PHP,我试图从普适DB v9.5中读取数据,并将其插入Windows 2008上的PostgreSQL 9.3(编码:UTF-8)。我没有选择或编写PervisiveDB(我只是从中读取数据)。使用ODBC,我从普适数据库读取数据,并将其毫无问题地写入控制台。然而,当我尝试将其插入Postgre时,我遇到了

Warning: pg_execute(): Query failed: ERROR:  invalid byte sequence for encoding "UTF8": 0x94 in file.php on line ..
所以,我看到博士后不喜欢我给的绳子

然后我用

var_dump(iconv_get_encoding('all'));
我的编码是ISO-8859-1

并使用

iconv ( 'ISO-8859-1' , 'UTF-8' , $a)
现在,错误消失了。但是到达Postgres的字符串不正确


我使用的代码如下。我的测试字符串是aöaçaıaĞaĞaÜaúaŞaİaÜaÜ

echo iconv ( 'ISO-8859-1' , 'UTF-8' , $a)
$a是从中派生的字符串

echo $a; 

给出了aöaçaıaĞaäaŞaİaĞaÜ

echo iconv ( 'ISO-8859-1' , 'UTF-8' , $a)
给出┬öa┬ça┬şa┬ıa┬奥加┬尤阿┬Öa┬切阿┬Şa┬İa┬Ğa┬Ü

<?php
//var_dump(iconv_get_encoding('all'));

$conn = pg_connect("host=localhost port=5432 dbname=xxx user=xxx password=".$argv[1]);

$result = pg_prepare($conn, "my_query", 'SELECT * FROM func_my_deneme($1)');

$connect_string = "DRIVER={Pervasive ODBC Client Interface}; SERVERNAME=localhost; SERVERDSN=xxx;";
$pervasiveconn = odbc_connect($connect_string, 'xxx', 'xxx');

$pervasive_result = odbc_exec($pervasiveconn ,"SELECT something");

while(odbc_fetch_row($pervasive_result)){
  $a=odbc_result($pervasive_result,1);

  echo $a;

  $result = pg_execute($conn, "my_query", array(iconv ( 'ISO-8859-1' , 'UTF-8' , $a)));
}
?>

您似乎只看到这里的两种编码交换中的一种

你有:

(pervasive's native encoding) -> (PHP string)

其中,您只显式地处理第二个。您假设数据的ODBC驱动程序返回的是PHP的默认编码,在您的系统上是iso-8859-1

您的测试表明该假设可能是正确的,但简单地回显字符串并不是一种很好的判断方法,因为这引入了另一个编码步骤:

(PHP string) -> (whatever decodes it for viewing)
无论是网络浏览器、终端还是其他什么。如果查看器希望某些编码恰好与所使用的编码相同,它将正确解码输出

尝试:

并确保查看器显示的两个值相同。确保编辑源文件时将编码设置为
iso-8859-1
,而不是其他编码,以便粘贴的字符串的文字字节是正确的

此时,如果编辑器设置正确,则会出现错误,因为并非所有这些字符在iso-8859-1中都是合法的。第一个无效的是
ş

所以很明显,来自普适的不可能是iso-8859-1。要真正打印拉丁文-1字符串,可以回显转义的字节。例如,此字符串:

aöaçaaaüaÖaÇaaaaÜ
其中所有字符均为合法iso-8859-1,以iso-8859-1编码打印,并带有:

echo "a\xf6a\xe7aaa\xfca\xd6a\xc7aaaa\xdc"
这里,十六进制转义用于指定非7位字符,以明确地确保字节序列的编码是您所认为的,而不会对文本编辑器等产生任何混淆

Betcha,当你查看它时,它不会正确打印,因为任何读取输入的东西都不会将其解码为iso-8859-1


您应该做的是查看从“普及”中获得的字符串字节,以了解它的实际内容。然后确定其编码并将其解码为utf-8,然后可以通过
client\u encoding=utf-8
连接将其发送到PostgreSQL@deceze为此建议了
bin2hex
(我不会说PHP,所以不知道该建议什么)。因此,请显示以下各项的输出:

echo bin2hex($a) . "\n";
或者——甚至更好——确保您从配置/文档中确定来自普适的数据的编码是什么,而不是猜测。或者只是强迫它

快速浏览一下普遍使用的文档,就会发现ODBC驱动程序有一个
encoding
参数,该参数采用所需编码的代码页ID。因此,请尝试:

$connect_string = "DRIVER={Pervasive ODBC Client Interface}; SERVERNAME=localhost; SERVERDSN=xxx; encoding=65001";

(至少微软将65001定义为utf-8 per的代码页)。

您似乎只看到这里的两种编码交换之一

你有:

(pervasive's native encoding) -> (PHP string)

其中,您只显式地处理第二个。您假设数据的ODBC驱动程序返回的是PHP的默认编码,在您的系统上是iso-8859-1

您的测试表明该假设可能是正确的,但简单地回显字符串并不是一种很好的判断方法,因为这引入了另一个编码步骤:

(PHP string) -> (whatever decodes it for viewing)
无论是网络浏览器、终端还是其他什么。如果查看器希望某些编码恰好与所使用的编码相同,它将正确解码输出

尝试:

并确保查看器显示的两个值相同。确保编辑源文件时将编码设置为
iso-8859-1
,而不是其他编码,以便粘贴的字符串的文字字节是正确的

此时,如果编辑器设置正确,则会出现错误,因为并非所有这些字符在iso-8859-1中都是合法的。第一个无效的是
ş

所以很明显,来自普适的不可能是iso-8859-1。要真正打印拉丁文-1字符串,可以回显转义的字节。例如,此字符串:

aöaçaaaüaÖaÇaaaaÜ
其中所有字符均为合法iso-8859-1,以iso-8859-1编码打印,并带有:

echo "a\xf6a\xe7aaa\xfca\xd6a\xc7aaaa\xdc"
这里,十六进制转义用于指定非7位字符,以明确地确保字节序列的编码是您所认为的,而不会对文本编辑器等产生任何混淆

Betcha,当你查看它时,它不会正确打印,因为任何读取输入的东西都不会将其解码为iso-8859-1


您应该做的是查看从“普及”中获得的字符串字节,以了解它的实际内容。然后确定其编码并将其解码为utf-8,然后可以通过
client\u encoding=utf-8
连接将其发送到PostgreSQL@deceze为此建议了
bin2hex
(我不会说PHP,所以不知道该建议什么)。因此,请显示以下各项的输出:

echo bin2hex($a) . "\n";
或者——甚至更好——确保您从配置/文档中确定来自普适的数据的编码是什么,而不是猜测。或者只是强迫它

快速浏览一下普遍使用的文档,就会发现ODBC驱动程序有一个
encoding
参数,该参数采用所需编码的代码页ID。因此,请尝试:

$connect_string = "DRIVER={Pervasive ODBC Client Interface}; SERVERNAME=localhost; SERVERDSN=xxx; encoding=65001";

(至少微软将65001定义为utf-8 per的代码页)。

您似乎只看到这里的两种编码交换之一

你有:

(pervasive's native encoding) -> (PHP string)