com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: неизвестный столбец «C3714552» в «где предложение» - PullRequest
0 голосов
/ 04 мая 2018
Statement st1 = conn.createStatement();
ResultSet rs2 = st1.executeQuery("
   SELECT cui_2 
   FROM diagnostico.disease_has_symptom, diagnostico.symptom
   WHERE(
      `symptom`.`cui` = `disease_has_symptom`.`cui_2` AND 
      `symptom`.`cui` = " + sintomas.pop() + ");
");

Я не знаю, почему я получаю эту ошибку ...

1 Ответ

0 голосов
/ 04 мая 2018

Как указывает @Brad, ваша главная проблема связана с запутанными кавычками, где `symptom`.`cui` = " + sintomas.pop() + "); должно быть: `symptom`.`cui` = ' + sintomas.pop() + ');.

Почему это так? Согласно SQL-ANSI 92 (более старая версия формального отраслевого стандарта языка SQL, которого придерживается большинство СУБД, включая SQL Server, Oracle, Postgres, MySQL и т. Д.), Одинарные кавычки и двойные кавычки используются для разных целей.

Двойные кавычки используются для идентификаторов, включая имена столбцов и таблиц, такие как "symptom"."cui".

В разделе 5.2 и SQL-92 doc ниже приведено определение функции идентификатора с разделителями:

<delimited identifier> ::=
   <double quote> <delimited identifier body> <double quote>

Ниже приведены несколько распространенных случаев использования этого типа:

  • Двойные кавычки допускают пробелы, согласно 5.2 - Синтаксические правила

    2) With the exception of the <space> character explicitly contained
        in <timestamp string> and <interval string> and the permitted
        <separator>s in <bit string literal>s and <hex string literal>s,
        a <token>, other than a <character string literal>, a <national
        character string literal>, or a <delimited identifier>, shall not 
        include a <space> character or other <separator>.
    
  • Двойные кавычки обозначают чувствительность к регистру по сравнению с обычными идентификаторами:

    13)A <regular identifier> and a <delimited identifier> are equivalent 
        if the <identifier body> of the <regular identifier> (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the <delimited identifier
        body> of the <delimited identifier> (with all occurrences of
        <quote> replaced by <quote symbol> and all occurrences of <dou-
        blequote symbol> replaced by <double quote>), considered as
        the repetition of a <character string literal> that specifies a
        <character set specification> of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "<comparison
        predicate>".
    

Однако некоторые СУБД имеют свои собственные экранирующие символы для специальных символов, пробелов и зарезервированных слов , которые не являются стандартами ANSI. Например, SQL Server может использовать квадратные скобки [...]; и MySQL может использовать обратные метки `...`.


Одинарные кавычки используются для включения строковых литералов в столбцы типа char, varchar, text, такие как 'C3714552'. Сообщение об ошибке возникает из-за того, что вы используете двойные кавычки, а движок MySQL ищет идентификатор столбца, поскольку вы заключаете значение в двойные кавычки.

В соответствии с 5.3 из SQL-92 doc, ниже приведено определение строкового литерала (без двойных кавычек):

 <character string literal> ::=
      [ <introducer><character set specification> ]
      <quote> [ <character representation>... ] <quote>
        [ { <separator>... <quote> [ <character representation>... ] <quote> }... ]

А под 5.3 - Синтаксические правила:

 1) In a <character string literal> or <national character string
    literal>, the sequence:

      <quote> <character representation>... <quote>
      <separator>... <quote> <character representation>... <quote>

    is equivalent to the sequence

      <quote> <character representation>... <character representa-
      tion>... <quote>

С учетом сказанного, MySQL предоставляет различные не-ANSI режимы , которые могут использовать двойные кавычки для строковых литералов. Но, возможно, серверные API, такие как JDBC или ODBC, драйверы по умолчанию соответствуют стандартам ANSI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...