将重音字符从PHP脚本保存到Oracle DB

时间:2010-08-24 08:08:05

标签: php oracle diacritics

我正在尝试将重音字符(èòàèì)保存到VARCHAR2字段中的Oracle DB;我已经把

<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

我该怎么办?请帮助我: - (

提前致谢! 角

7 个答案:

答案 0 :(得分:11)

确保您的表具有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

答案 1 :(得分:1)

你的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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

如果你的源文件有这行:

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

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

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

请记住,元标记和文件的编码类型不一样。您可以通过许多程序检查和转换yor文件,请参阅notepad ++,您应该编写“没有BOM的UTF-8”。

另外可以肯定的是,如果他们有这样的选项,你的数据库/表/连接被设置为UTF-8。

还检查从数据库获取数据的方式 - 可能插入正常,但在查询获取数据时字符会被破坏。

答案 4 :(得分:0)

我很担心这条线。

$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'è');

答案 5 :(得分:0)

我遇到了同样的问题并用utf8_decode();

修复了它
    $textForDB = utf8_decode("Áà");

答案 6 :(得分:0)

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

mbstring.internal_encoding = UTF-8;