/ / HSQLDB ignore la casse - java, hsqldb

HSQLDB ignore le cas - java, hsqldb

Avoir ce code en 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";");

Lance une exception org.hsqldb.HsqlException

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

Mais pourquoi? J'ai dit ignore_case=true!

Voir ce lien: http://hsqldb.org/doc/guide/dbproperties-chapt.html#N15A0A

Réponses:

3 pour la réponse № 1

Par défaut, sans les guillemets, les noms sontinsensible à la casse. Mais vous mettez les noms de table entre guillemets, ils sont donc enregistrés exactement tels quels, en respectant la casse. Les deux noms de table sont alors différents et HSQLDB ne leur correspondra pas.

Cela fonctionnera:

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;");
}
}

Qu'est ce que sql.ignore_case faire alors?

Il s'assure que le varchar la comparaison est insensible à la casse. Par exemple abc sera jumelé avec 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
}
}