【问题标题】:Storing chinese character in oracle using ajax is not working使用ajax在oracle中存储汉字不起作用
【发布时间】: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 CHINESETRADITIONAL 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);

标签: php jquery ajax oracle


【解决方案1】:

确保您已将 OCI 连接设置为使用 UTF-8:

oci_connect($username, $password, $connection_string, 'UTF8');

这告诉 Oracle 您正在发送和期望接收的字符集编码。然后,Oracle 会自动处理服务器和客户端之间的“转换”。来自documentation(强调我的):

确定 Oracle 客户端库使用的字符集。字符集不需要匹配数据库使用的字符集。 如果不匹配,Oracle 将尽最大努力将数据与数据库字符集相互转换。根据字符集,这可能不会给出可用的结果。转换也增加了一些时间开销。

您唯一需要注意的是您的 PHP 应用程序将所有内容都视为 UTF-8。

【讨论】:

  • 我尝试了上面的代码,但没有运气:-(,我添加了屏幕短请检查
  • @ArchanaPalani 仔细检查所有 PHP 文件是否以 UTF-8(不是 ANSI)保存。
【解决方案2】:

试试

<meta http-equiv="content-type" content="text/html; charset=UTF-8" />

而不是

<meta http-equiv="Content-type" value="text/html; charset=utf-8">

【讨论】:

  • 我厌倦了上述建议,仍然是同样的问题,我是否遗漏了 oracle 方面的任何内容? ,因为我尝试了所有可能的方法来解决,但没有任何帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多