/ / HSQLDB ignoriert case - java, hsqldb

HSQLDB ignoriert case - java, hsqldb

Mit diesem Code in Java:

Connection c = jdbcDriver.getConnection("jdbc:hsqldb:mem:test;sql.ignore_case=true", null);
Statement stmt = c.createStatement();
stmt.executeUpdate("CREATE TABLE "TEST"(ID INT)");
stmt.executeQuery("SELECT id FROM "test";");

Löst eine org.hsqldb.HsqlException aus

Exception in thread "main" java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: test
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
at Test.main(Test.java:15)
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: test
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.error.Error.error(Unknown Source)
at org.hsqldb.ParserDQL.readTableName(Unknown Source)
at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
at org.hsqldb.ParserCommand.compilePart(Unknown Source)
at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
at org.hsqldb.Session.executeDirectStatement(Unknown Source)
at org.hsqldb.Session.execute(Unknown Source)
... 3 more

Aber warum? Ich sagte ignore_case=true!

Siehe diesen Link: http://hsqldb.org/doc/guide/dbproperties-chapt.html#N15A0A

Antworten:

3 für die Antwort № 1

Standardmäßig sind die Namen ohne die AnführungszeichenGroß- und Kleinschreibung Aber Sie setzen die Tabellennamen zwischen Anführungszeichen, so dass sie genau so registriert werden, wie es ist, Groß-und Kleinschreibung. Die zwei Tabellennamen sind dann unterschiedlich und HSQLDB wird ihnen nicht entsprechen.

Das wird funktionieren:

import java.sql.*;

public class Main {
public static void main(String[] args) throws Exception {
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:test", "SA", "");
Statement stmt = c.createStatement();
stmt.executeUpdate("CREATE TABLE TEST(ID INT)");
stmt.executeQuery("SELECT id FROM test;");
}
}

Was macht sql.ignore_case dann?

Es stellt sicher, dass die varchar Beim Vergleich wird die Groß- / Kleinschreibung nicht berücksichtigt. Zum Beispiel abc wird mit abgestimmt werden ABC:

import java.sql.*;

public class Main {
public static void main(String[] args) throws Exception {
Connection c = DriverManager.getConnection("jdbc:hsqldb:mem:test;sql.ignore_case=true", "SA", "");
Statement stmt = c.createStatement();
stmt.executeUpdate("CREATE TABLE TeSt(NAME VARCHAR(99))");
stmt.executeUpdate("INSERT INTO tEsT (NAME) VALUES ("ABC")");
ResultSet rs = stmt.executeQuery("SELECT * FROM TesT WHERE NAME = "abc"");
rs.next();
System.out.println(rs.getString(1)); // prints: ABC
}
}