Как указывает @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.