PHP PDO Firebird字符集永远不会改变

时间:2016-07-17 17:51:06

标签: php pdo firebird

连接字符串就像;

firebird:dbname=PRODUCTS.GDB;charset=UTF8

但未正确返回unicode字符。我尝试将它更改为utf-8,带有短划线,小字母和大字母,以及其他字符集,如ISO8859_9 ..所有都是一样的。

1 个答案:

答案 0 :(得分:1)

问题是您使用字符集NONE作为列。对于具有字符集NONE的列,所有投注均已关闭,因为Firebird无法音译到指定的连接字符集,并将按原样发送数据。处理特定于客户端应用程序或驱动程序,有些将应用默认系统编码,其他人将假设它处于他们期望的连接字符集(在您的情况下为UTF-8)等。这样做甚至可能导致逻辑数据损坏(例如,因为您将其存储在UTF-8中,而另一个应用程序正在检索它,需要Windows-1254或ISO-8859-9)。

它可能在另一个应用程序中显示正确的事实,可能是因为该应用程序假定存储的数据是在某个字符集中并且猜对了。

我不知道PHP,也不知道PDO,但解决方法可能是在连接字符串中指定数据的实际字符集(例如WIN1254而不是UTF8),因为这可能导致正确转换的字符。

但是,唯一真正的解决方案是使用除NONE之外的默认字符集创建新数据库,执行DDL(并为需要具有不同字符的列指定显式字符集),然后将数据从旧数据库泵入新数据库,确保应用正确的字符集转换。

完成此操作后,您还需要确保连接到此数据库的所有应用程序都使用显式连接字符集。