【发布时间】:2016-12-25 05:26:41
【问题描述】:
我想使用 ajax 概念将 html 页面中的中文字符存储到 oracle 数据库中。
Front end : HTML & PHP.
Back end : Oracle 11G.
Oracle 特征:
NLS_LANGUAGE = AMERICA
NLS_CHARACTERSET = WE8MSWIN1252
NLS_NCHAR_CHARACTERSET = AL16UTF16
当我尝试使用表单提交存储汉字时,它会成功存储,如果我尝试通过 ajax 存储,我会在数据库中得到奇怪的字符。
在 ajax 页面中我添加了这一行:
header("Content-type: text/html; charset=utf-8");
并在 html 页面中添加以下行:
<meta http-equiv="Content-type" value="text/html; charset=utf-8">
我经历了许多堆栈溢出建议,但没有运气。
请告诉我如何解决这个问题。
提前致谢。
代码:HTML 代码。
<html>
<head>
<meta http-equiv="Content-type" value="text/html; charset=utf-8">
<title>Test</title>
<script src="jquery.min.js"></script>
<script>
function addForm()
{
var english=document.getElementById('txt_english').value;
var id=document.getElementById('txt_id').value;
var chinese=document.getElementById('txt_chinese').value;
$.ajax({
type: "POST",
async: false,
url: "ajax/ajax_add_form.php",
data:
{
english: english,
chinese: chinese,
id: id
}
}).done(
function (html){
alert(html);
});
}
</script>
</head>
<body>
<input type='text' name='txt_id' id='txt_id' value='' /><br>
<input type='text' name='txt_english' id='txt_english' value='' />
<input type='text' name='txt_chinese' id='txt_chinese' value='' />
<button type="button" onclick="addForm()">Click Me!</button>
</body>
</html>
PHP 代码:ajax/ajax_add_form.php
<?php
header("Content-type: text/html; charset=utf-8");
include("../config.php");
extract($_REQUEST);
$sql=oci_parse($conn,"insert into test(id,english,chinese1)values(:id,:english,:chinese)");
oci_bind_by_name($sql, ':id', $id);
oci_bind_by_name($sql, ':english', $english);
oci_bind_by_name($sql, ':chinese', $chinese);
oci_execute($sql);
echo "success";
?>
我的问题:
即使当我返回网页时它以另一种格式存储,它也可以正常工作并正确显示。
我的问题是另一个名为敏捷的工具也在访问相同的数据,因此没有发生转换,它显示了数据库中存储的数据格式。
因此我想完全按照用户输入的方式存储,不需要任何转换。
【问题讨论】:
-
设置环境变量
NLS_LANG=AMERICAN_AMERICA.AL32UTF8 -
数据类型应为 nvarchar 或 Environment.SetEnvironmentVariable("NLS_LANG", "CHINESE_CHINA.WE8ISO8859P1", EnvironmentVariableTarget.Process)
-
@WernfriedDomschei 我尝试设置该环境,但无法访问 NLS 数据文件或指定的环境无效。我当前的系统语言环境是中文(简体,PRC),我的问题是即使它在网页中显示时以其他格式存储,它也能完美显示。但是同样的数据可以通过其他敏捷工具访问,它显示了存储在 DB 中的格式,我的意思是错误的格式。
-
@ManishGoswami,肯定字符集
WE8ISO8859P1将不适用于汉字。此外,Oracle 中不存在 NLS 语言CHINESE,请使用SIMPLIFIED CHINESE或TRADITIONAL CHINESE。检查SELECT * FROM V$NLS_VALID_VALUES WHERE parameter = 'LANGUAGE'; -
您应该使用带有绑定参数的预处理语句,即
$sql=oci_parse($conn,"insert into test(id,english,chinese)values(:id, :en, :cn)"); oci_bind_by_name($sql, ':id', $id); oci_bind_by_name($sql, ':en', $english); oci_bind_by_name($sql, ':cn', $chinese);