我正在尝试将重音字符(èòàèì)保存到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
我该怎么办?请帮助我: - (
提前致谢! 角
答案 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');
完整文档:
答案 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。
此页面上描述了可能相同的问题:
答案 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;