0

我在使用 Doctrine 2 映射 DB2 表时遇到问题。应用程序存在很长时间,出于奇怪的原因,在某些列名前添加了一个“£”特殊字符。

例如:£ADRB1

在检查文档时,发现这是 Doctrine 不太喜欢的东西。顺便说一句,连接是通过 ODBC 驱动程序进行的:/ 我无法更改。

实体列是这样配置的:

/**
 * @ORM\Column(name = "`£ADRB1`", type="string", length=38, options={"default":""})
 */
protected $ADRB1;

错误是

SQLSTATE[HY090]:无效的字符串或缓冲区长度:0 [IBM][System i Access ODBC 驱动程序]无效的字符串或缓冲区长度。(SQLPrepare[0] 在 /patched-php-src-5.5.7/php-5.5.7/ext/pdo_odbc/odbc_driver.c:206)

尝试使用简单的 queryBuilder 获取结果时。

有没有可能让它与 Doctrine 2 一起使用?

非常感谢 !

4

1 回答 1

1

我对 Doctrine2 一无所知,但如果问题的根源与列名有关 [鉴于该错误与列名无关,这似乎至少有些脆弱],那么问题可能与列 [可能是作为服务器的 IBM i] 具有使用 EBCDIC 代码点 0x5B 定义的第一个字符。

虽然 EBCDIC 代码点 x'5B' 可以有效地表示某些代码页中的变体 美元符号字符 [一个有效但不鼓励的字符,就像 @; 请参阅:在变量名称上使用 @ ],从 ASCII 客户端发送的英镑符号字符 [ASCII 代码点 0xA3] 可能无法转换为 EBCDIC 代码点 x'5B'。结果取决于如何为代码页配置服务器,并且该字符很可能会转换为 EBCDIC 代码点 0xB1;不太可能代表 SQL 标识符(例如列名)的有效字符的代码点。

因此,如果客户端可以引用指定第一个字符作为$字符而不是字符的列名£,那么当发生从 ASCII 到 EBCDIC 的预期\正确字符转换时,服务器将正确地将列名视为预期名称; 即实际上将看到 EBCDIC [hex:5BC1C4D9C2F1] 中的字符 $ADRB1 是从 ASCII 字符 $ADRB1 [hex:2441445231] 转换而来的,而不是可能的\不希望出现的结果,而实际上服务器将在其中看到字符 £ADRB1 EBCDIC [hex:B1C1C4D9C2F1] 从 ASCII 字符 £ADRB1 [hex:A341445231] 翻译而来。

ps 标签 DB2i 在 wiki 中定义为DB2 for IBM i,标签 DB2 在 wiki 中定义为DB2 family,但标签 ibm-db2 没有定义https://stackoverflow.com/tags/ibm- db2/info,所以如果服务器是 IBM i 并使用 DB2 for i 作为数据库,那么 DB2i 可能是标记该主题的更好[或附加]选择。

于 2015-05-17T20:36:21.297 回答