【问题标题】:Saving accented characters from PHP script to Oracle DB将重音字符从 PHP 脚本保存到 Oracle DB
【发布时间】:2011-04-03 01:03:48
【问题描述】:

我正在尝试将重音字符 èòàèì 保存到 VARCHAR2 字段中的 Oracle 数据库中。我放了

<html>
<head>
   <meta http-equiv="Content-type" value="text/html; charset=utf-8">
</head>
<body>
<?php
 header('Content-type: text/html; charset=utf-8');

....
//在这里我将插入到数据库中:

$str=utf8_encode("JeanPièrre"); // or $str="JeanPièrre" ... is the same, it does not run
$sql="insert into TABLE(nvar) values('".$str."')";
$stmt = oci_parse($ora_conn, $sql) or die(oci_error().$query);
oci_execute($stmt);

但是重音字符没有正确保存,我看到JeanPi??rre

我能做什么?请帮助我。
提前致谢!

【问题讨论】:

  • 我对 OracleDb 不太了解,但您的表/连接似乎不是 UTF-8。

标签: php oracle diacritics


【解决方案1】:

确保您的表具有 UTF8 字符集,并确保与数据库的连接使用 UTF8。在搜索 Oracle 示例时,我发现了这个:

resource oci_connect  ( string $username  , string $password  [, string $connection_string  [, string $character_set  [, int $session_mode  ]]] )

会变成这样的

$conn = oci_connect('insertUsername', 'insertPassword', 'insertHostname', 'AL32UTF8');

完整文档:

http://nl3.php.net/oci_connect

【讨论】:

  • 你能用其他方法插入字符吗?例如 sql*plus?如果您在插入字符后将字符回显到屏幕上,它们的重音是否正确?只是想看看你的问题是oracle,驱动程序还是php ..
  • 我认为这是一个 PHP 问题,因为如果我通过 sql*plus 进行插入,它运行良好。我已将 NLS_LANG 变量设置为 AMERICAN_AMERICA.UTF8;我在 oracle 即时客户端上使用 php5
  • 您可以添加一些您在尝试此解决方案时使用的额外代码吗?
  • 我没有更改 php 代码,只是在 /etc/profile 中添加了 export NLS_LANG="AMERICAN_AMERICA.UTF8"
  • 肯定和连接设置有关。这个输出是什么:echo getenv("NLS_LANG");
【解决方案2】:

你的 NLS_CHARACTERSET 是什么? (直接在数据库中设置)。 值可能与 NLS_LANG 不同(与客户端运行的编码不同)。 您会发现此值运行以下 SQL 查询:

SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS;

我的数据库的输出如下所示(我的 NLS_CHARACTERSET=AL32UTF8):

SQL> col PARAMETER format a25
SQL> col VALUE format a50
SQL> SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS;

PARAMETER                 VALUE
------------------------- --------------------------------------------------
NLS_LANGUAGE              AMERICAN
NLS_TERRITORY             AMERICA
NLS_CURRENCY              $
NLS_ISO_CURRENCY          AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CHARACTERSET          AL32UTF8
NLS_CALENDAR              GREGORIAN
NLS_DATE_FORMAT           DD-MON-RR
NLS_DATE_LANGUAGE         AMERICAN
NLS_SORT                  BINARY
NLS_TIME_FORMAT           HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT      DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT        HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY         $
NLS_COMP                  BINARY
NLS_LENGTH_SEMANTICS      BYTE
NLS_NCHAR_CONV_EXCP       FALSE
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_RDBMS_VERSION         9.2.0.6.0

20 rows selected.

问题可能与您的客户端的编码设置有关(我不是指 PHP 函数“utf8_encode”,而是真正编码您的工作站,脚本运行的地方)。或者它是不同的编码数据库和值 NLS_CHARACTERSET。

此页面上描述了可能相同的问题:

http://www.databaseanswers.org/ora_nls_support.htm

【讨论】:

    【解决方案3】:

    我通过将 NLS_LANG=American_America.WE8ISO8859P1 添加到 /etc/init.d/apache2 文件中的 ENV 变量解决了我的问题。

    这使得 PHP 向 Oracle DB 发送正确的字符。

    【讨论】:

      【解决方案4】:

      如果你的源文件有这一行:

      $str=utf8_encode("JeanPièrre");
      

      已经用 UTF-8 编码(我的意思是文件),那么你不必编码“JeanPièrre”,因为它已经用 UTF-8 编码了。

      带有编码的元标记仅用于显示或处理表单 - 它不会影响您的源代码和后端工作。

      请记住,文件的元标记和编码类型是不一样的。您可以通过许多程序检查和转换您的文件,请参见 notepad++,您应该致力于编码“UTF-8 without BOM”。

      还要确保您的数据库/表/连接设置为 UTF-8(如果他们有这样的选项)。

      还要检查您从数据库获取数据的方式 - 可能插入没问题,但查询获取数据时字符会损坏。

      【讨论】:

      • 我尝试将文本文件保存为 UTF8 并放入 $str="JeanPièèèèerre" 但没有成功。如果我从 sqlplus 中选择数据,我会看到错误的字符并看到从 sql 插入的记录的良好字符加上不使用 PHP
      【解决方案5】:

      我很担心这条线。

      $sql="insert into TABLE(nvar) values('".$str."')";
      

      它不是通过变量绑定字符串值,而是简单地将其连接到插入中。这在 Oracle 中是不好的做法。绑定用法的示例是:

      $sql = "insert into TABLE(nvar) values( :str )";
      $stmt = oci_parse($ora_conn, $sql) or die(oci_error().$query);
      ocibindbyname($stmt,":str",&$str,6);
      oci_execute($stmt);
      

      所以我先解决这个问题。解决错误的可能性很小。它被提及here,但不是特别清楚。基本上它意味着在做之间的文字方面存在一些差异

      INSERT INTO table VALUES ('è');
      

      INSERT INTO table VALUES (N'è');
      

      【讨论】:

        【解决方案6】:

        我遇到了同样的问题,用 utf8_decode(); 修复了它

            $textForDB = utf8_decode("Áà");
        

        【讨论】:

          【解决方案7】:

          我已经更改了 php.ini 文件中的设置并且它起作用了。 以下需要在php.ini中启用

          mbstring.internal_encoding = UTF-8;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-03
            • 2012-11-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多