将重音字符从 PHP 脚本保存到 Oracle DB
我正在尝试将重音字符 èòàèì
保存到 Oracle DB 的 VARCHAR2 字段中。我已经放了
<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
我能做什么?请帮助我。
提前致谢!
I'm trying to save accented chars èòàèì
to an Oracle DB in a VARCHAR2 field. I've put
<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
What can I do? Pls help me.
Thanks in advance!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我已经更改了 php.ini 文件中的设置并且它起作用了。
需要在 php.ini 中启用以下内容
I have changed the setting in php.ini file and it worked.
The following needs to be enabled in php.ini
我很关心这条线。
它不是通过变量绑定字符串值,而是简单地将其连接到插入中。这在 Oracle 中是不好的做法。绑定用法的一个例子是:
所以我首先解决这个问题。解决该错误的可能性很小。 这里提到了,但它不是特别清楚。 doing 之间在文字上存在一些差异
基本上它意味着doing和
I'm concerned about this line.
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 :
So I'd start by fixing that. There's a small chance that will resolve the error. It gets mentioned here but it isn't particularly clear. Basically it implies there's some difference regarding literals between doing
and
我遇到了同样的问题并使用 utf8_decode(); 修复了它
I had the same problem and fixed it with utf8_decode();
如果您的源文件包含以下行:
已经以 UTF-8 编码(我的意思是文件),那么您不必对“JeanPièrre”进行编码,因为它已经以 UTF-8 编码。
带编码的元标记仅用于显示或处理表单目的 - 它不会影响您的源代码和后端工作。
请记住,元标记和文件的编码类型不同。您可以通过许多程序检查和转换您的文件,请参阅notepad++,您应该致力于编码“UTF-8 without BOM”。
另外请确保您的数据库/表/连接设置为 UTF-8(如果有此类选项)。
还要检查您从数据库获取数据的方式 - 也许插入是可以的,但是在查询获取数据时字符被破坏。
If your source file, which has this line:
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.
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".
Also be sure, that your DB/table/connection are set to UTF-8 if they have such option.
Check also your way to get data from database - maybe inserting is ok, but characters are broken when querying to fetch data.
你的 NLS_CHARACTERSET 是什么? (直接在数据库中设置)。
值可能与 NLS_LANG 不同(与客户端运行的编码不同)。
运行以下 SQL 查询时,您会发现该值:
我的数据库的输出如下所示(我的 NLS_CHARACTERSET=AL32UTF8):
问题可能出在您客户端的编码设置(我不是指 PHP 函数“utf8_encode”,而是真正编码了您的客户端)工作站,脚本运行的地方)。或者它是不同的编码数据库和值 NLS_CHARACTERSET。
此页面上描述了可能相同的问题:
http://www.databaseanswers.org/ora_nls_support.htm
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:
Output from my database look like this (my NLS_CHARACTERSET=AL32UTF8):
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.
Probably identical problem is described on this page:
http://www.databaseanswers.org/ora_nls_support.htm
我通过将 NLS_LANG=American_America.WE8ISO8859P1 添加到 /etc/init.d/apache2 文件中的 ENV 变量解决了我的问题。
这使得 PHP 向 Oracle DB 发送正确的字符。
i've solved my problem by adding NLS_LANG=American_America.WE8ISO8859P1 to the ENV variable in /etc/init.d/apache2 file.
This made PHP sending correct chars to the Oracle DB.
确保您的表具有 UTF8 字符集,并确保与数据库的连接使用 UTF8。搜索 Oracle 示例时我发现了这个:
它将变成类似
完整文档:
https://www.php.net /oci_connect
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:
Which will become something like
Full documentation:
https://www.php.net/oci_connect