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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/3554553/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 21:21:39  来源:igfitidea点击:

Saving accented characters from PHP script to Oracle DB

phporaclediacritics

提问by Cris

i'm trying to save accented chars (èòàèì) to an Oracle DB in a VARCHAR2 field; i've put

我正在尝试将重音字符 (èòàèì) 保存到 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');

.... //and here i make the insert into the DB:

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

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

But accented character is not saved correctly , i see JeanPi??rre

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

What can i do? Pls help me :-(

我能做什么?请帮助我 :-(

Thanks in advance ! c.

提前致谢 !C。

回答by Rene Terstegen

Make sure your tables have a UTF8 character set and make sure the connection with your database is using UTF8. Searching for a Oracle example I found this:

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

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

Which will become something like

哪个会变成这样

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

Full documentation:

完整文档:

http://nl3.php.net/oci_connect

http://nl3.php.net/oci_connect

回答by Cris

i've solved my problem by adding NLS_LANG=American_America.WE8ISO8859P1 to the ENV variable in /etc/init.d/apache2 file.

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

This made PHP sending correct chars to the Oracle DB.

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

回答by Martin Mares

What is your NLS_CHARACTERSET? (settings directly in the database). Value may be different from NLS_LANG (different from encoding, wher client run). This value you will find run the following SQL query:

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

SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS;

Output from my database look like this (my NLS_CHARACTERSET=AL32UTF8):

我的数据库的输出看起来像这样(我的 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.

The problem may be either with encoding settings your client (I do not mean PHP function "utf8_encode", but really encoding your workstation, where the script runs). Or it's different encoding database and the value NLS_CHARACTERSET.

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

Probably identical problem is described on this page:

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

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

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

回答by Gary Myers

I'm concerned about this line.

我很关心这条线。

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

Rather than binding the string value through a variable, it is simply concatenating it into the insert. This is poor practice in Oracle. An example of a bind usage is :

它不是通过变量绑定字符串值,而是简单地将它连接到插入中。这在 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);

So I'd start by fixing that. There's a small chance that will resolve the error. It gets mentioned herebut it isn't particularly clear. Basically it implies there's some difference regarding literals between doing

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

INSERT INTO table VALUES ('è');

and

INSERT INTO table VALUES (N'è');

回答by Piotr Müller

If your source file, which has this line:

如果您的源文件包含这一行:

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

is already encoded in UTF-8 (i mean just file), then you don't have to encode "JeanPièrre", because it's already in UTF-8.

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

Meta tag with encoding is only for display or handling forms purpose - it don't affect your source code and backend work.

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

Remember that meta tag and encoding type of file are not the same. You can check and convert yor files by many programs, see notepad++, you should work on encoding "UTF-8 without BOM".

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

Also be sure, that your DB/table/connection are set to UTF-8 if they have such option.

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

Check also your way to get data from database - maybe inserting is ok, but characters are broken when querying to fetch data.

还要检查您从数据库中获取数据的方式 - 也许插入是可以的,但是在查询以获取数据时字符被破坏了。

回答by Daniel Sousa

I had the same problem and fixed it with utf8_decode();

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

    $textForDB = utf8_decode("áà");

回答by Min

I have changed the setting in php.ini file and it worked. The following needs to be enabled in php.ini

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

mbstring.internal_encoding = UTF-8;