java的jdbc问题,这堆引号看得有点糊涂,数据的操作怎么运用这些引号啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的jdbc问题,这堆引号看得有点糊涂,数据的操作怎么运用这些引号啊?相关的知识,希望对你有一定的参考价值。

String sql = "SELECT * FROM T_PUBLISHER pub WHERE pub.ID = '" + id + "'";

java中双引号表示字符串。 而sql语句中如果你要查询的字段是char类型,也要加上 ‘’或""。这个就是字符串的拼接,'" + id + "'"。。拆分开来应该这么说。 '(sql中的查询条件引号)"(字符串拼接用)+id+"(字符串拼接用)'(sql中的查询条件引号)"(字符串拼接用,用来表示单引号的这个字符串)

-----------最终在sql端执行的其实是这样的
SELECT * FROM T_PUBLISHER pub WHERE pub.ID ='xxxx'
参考技术A 首先,string类型赋值,用的“”也就是最外面的双引号,然后是语句里面的ID,因为这个id是你从程序里面动态调用的,随意需要用字符串叠加的方式,而ID在数据库中是varchar类型,所以sql语句必须在id前面加上单引号,所以就变成你看到的这样了 参考技术B 字符串之间连接使用+连接的 这个就相当于SELECT * FROM T_PUBLISHER pub WHERE pub.ID=id;追问

引号

追答

sql语句中的字符用单引号'' 对吧。连接字符串用双引号“”对吧 这不正好是=‘“ +id+”‘“;吗?最后的+后面是双引号中有个单引号,这是一个单独字符串。

Java JDBC Postgres copyIn无法识别行尾并填充双引号

【中文标题】Java JDBC Postgres copyIn无法识别行尾并填充双引号【英文标题】:Java JDBC Postgres copyIn not recognizing end of line and padding double quotes 【发布时间】:2018-08-12 04:49:39 【问题描述】:

我正在尝试使用 Java 将数据从 Oracle 加载到 Greenplum。我将结果集作为逗号分隔值存储到字节数组输入流中,然后使用复制加载它。

import java.sql.*; 
import au.com.bytecode.opencsv.CSVWriter;
import java.io.*;
import org.postgresql.copy.CopyManager;
import org.postgresql.core.BaseConnection;

public class ORtoGP    
        public static void main(String[] args) throws SQLException 
            try 
                String dbURL = "jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxxxx)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = xxxxxx) (SRVR = DEDICATED)))";
                String strUserID = "xxxxxx";
                String strPassword = "xxxxxx";
                Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword);
                Statement sqlStatement = myConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
                String readRecordSQL = "select id,name from table where rownum <= 10 ";
                ResultSet rs = sqlStatement.executeQuery(readRecordSQL); 

                StringWriter stringWriter = new StringWriter();
                CSVWriter csvWriter = new CSVWriter(stringWriter);

                rs.first(); 
                csvWriter.writeAll(rs, true);
                String orresult = stringWriter.toString();
                System.out.println(orresult);

                byte[] bytes = orresult.getBytes();
                ByteArrayInputStream orinput = new ByteArrayInputStream(bytes); 


                String dbURL1 = "jdbc:postgresql://xxxxx:5432/xxxxx";
                String user = "xxxx";
                String pass = "xxxx";
                Connection conn2 = DriverManager.getConnection(dbURL1, user, pass);

                CopyManager copyManager = new CopyManager((BaseConnection) conn2);
                copyManager.copyIn("copy java_test from stdin with DELIMITER ','",orinput);

                rs.close();
                myConnection.close();
                csvWriter.close();

             catch (Exception e) 
                System.out.println(e);
                   
        
    

但是,我遇到了两个问题:

    批量加载数据时,进程无法识别行尾。所以它给出了这个错误。 “错误:最后一个预期列之后的额外数据” 它还尝试加载数据,包括值周围的双引号。

【问题讨论】:

有一个更简单的方法。有两个开源项目可以更轻松地将数据从 Oracle 加载到 Greenplum。一个是外包商,另一个是 gplink。两者都可以在这里找到:pivotalguru.com 谢谢.. 我已经检查了 Outsourcer.. 它有一个依赖项,您需要从安装 gpfdist 的服务器或类似的服务器上运行它。我不记得具体细节,因为我已经有一段时间没有尝试过了,但它不能从“任何机器”运行。我仍然试图让它在特定的服务器上工作,但遇到了一些 Java 错误,所以我放弃了它。 外包商必须运行在集群中每个主机都可以访问的机器上。因此,由于分段主机位于专用网络中,因此 Master 或 Standby 是最佳选择。 谢谢.. 我们在从主或备用运行它时遇到了一些挑战。 DBA 已推迟主选项。我们在业务组之间在使用备用时存在操作问题。所以这个选项也被排除了。所以我放弃了。 【参考方案1】:

根据documentation,默认格式为text,不处理引用。

您需要在命令中指定FORMAT csv

【讨论】:

谢谢.. 我添加了这个 - copyManager.copyIn("copy java_test from stdin with csv header",orinput);,它解决了这些问题。但是,我得到一个不同的错误,org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x92 提示:如果字节序列与服务器预期的编码不匹配,也会发生此错误,这由“client_encoding”控制。我检查了数据库,发现它确实有 UTF8 编码。那么这个错误是否意味着传入的数据采用不同的编码形式?如何解决这个问题?谢谢。 您查看我提供的文档链接了吗?你看到ENCODING 选项了吗? 是的,我确实首先尝试了编码。不幸的是,我的 Postgres 版本不支持编码 - 8.2 (postgresql.org/docs/8.2/static/sql-copy.html)。我也试过这个 - orresult.replaceAll("\u0000", "");.. 但似乎没有太大区别。 您必须在读取数据时重新编码。问题不是\u0000,而是0x92 我将它添加到代码中,它也解决了编码问题.. - byte[] bytes = orresult.getBytes("UTF8"); .感谢您抽出宝贵时间。

以上是关于java的jdbc问题,这堆引号看得有点糊涂,数据的操作怎么运用这些引号啊?的主要内容,如果未能解决你的问题,请参考以下文章

java中JDBC是什么?

JDBC 似乎在我的数字周围加上了单引号

LIKE 中的单引号到 JDBC 准备语句中

SQL 范式(转载)

Java JDBC Postgres copyIn无法识别行尾并填充双引号

在 JDBC 中为 SQL Query 插入单引号不起作用