将重音字符从 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
Saving accented characters from PHP script to Oracle DB
提问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:
完整文档:
回答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:
此页面上描述了可能相同的问题:
回答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;