ошибка доступа к DB SQLSTATE [42000]: 1064 [дубликат]

Самый короткий ответ с использованием underscore / lodash

function elementsEqual(arr) {
    return !_.without(arr, arr[0]).length
}

spec:

elementsEqual(null) // throws error
elementsEqual([]) // true
elementsEqual({}) // true
elementsEqual([1]) // true
elementsEqual([1,2]) // false
elementsEqual(NaN) // true

изменить:

Или даже короче , вдохновленный ответом Тома:

function elementsEqual2(arr) {
    return _.uniq(arr).length <= 1;
}

spec:

elementsEqual2(null) // true (beware, it's different than above)
elementsEqual2([]) // true
elementsEqual2({}) // true
elementsEqual2([1]) // true
elementsEqual2([1,2]) // false
elementsEqual2(NaN) // true
497
задан Dharanidharan V 23 January 2018 в 09:46
поделиться

7 ответов

Если таблицы cols и значения являются переменными, то существует два способа:

С двойными кавычками "" полный запрос:

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

Или

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

С одинарными кавычками '':

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

Использовать обратные тики ``, когда имя столбца / значения похоже на зарезервированное ключевое слово MySQL.

Примечание: Если вы указываете имя столбца с именем таблицы, используйте обратные тики следующим образом:

`table_name`. `column_name` & lt; - Примечание: исключить . из обратных тиков.

483
ответ дан Nisse Engström 15 August 2018 в 22:30
поделиться
  • 1
    & quot; , но одинарные кавычки более широко принимаются другой СУБД " - использование одинарных кавычек для строковых литералов определяется (и требуется) стандартом SQL – a_horse_with_no_name 14 July 2014 в 09:57
  • 2
    @a_horse_with_no_name почти никто не использует ANSI MySQL ('|' для строки concat - действительно?) – Good Person 8 December 2015 в 00:31
  • 3
    это неверно: "MySQL также ожидает, что литеральные значения DATE и DATETIME будут одинарными кавычками как строки, такие как '2001-01-01 00: 00: 00' & quot; – Kick_the_BUCKET 12 April 2016 в 14:59
  • 4
    @Kick_the_BUCKET У вас есть альтернативное предложение? Оставляя их некотируемые результаты, они интерпретируются как целочисленная арифметика. Верно, что могут использоваться разные разделители, чем -, но цитирование необходимо, если не указаны разделители dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html – Michael Berkowski 12 April 2016 в 15:03
  • 5
    Документы @evilReiko MySQL, похоже, явно не ссылаются на псевдоним. Он будет принимать одиночные, двойные или обратные шаги для псевдонимов, но на них могут влиять различные режимы ANSI SQL. Я не уверен, что спецификация SQL требует для котировок псевдонимов. Личные предпочтения: для согласованности я цитирую их так же, как и идентификаторы столбцов, то есть я либо отпираю их, если это необходимо, либо оставляю их без кавычек, если нет. Я не использую одиночные или двойные кавычки в псевдонимах. – Michael Berkowski 16 August 2017 в 15:36

Здесь было много полезных ответов, в целом достигающих высшей точки в два пункта.

  1. BACKTICKS() `используются вокруг имен идентификаторов.
  2. QUOTES(') используются вокруг значений.

И как @MichaelBerkowski сказал

Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор является MySQL зарезервированным ключевое слово или когда идентификатор содержит символы пробела или символы за пределами ограниченного набора (см. ниже) Часто рекомендуется избегать использования зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, если это возможно, во избежание проблемы с кавычками.

Существует случай, когда идентификатор не может быть зарезервированным ключевым словом или содержать символы whitespace или за пределами ограниченного набора , но обязательно требует обратных ссылок вокруг их.

ПРИМЕР

123E10 является допустимым именем идентификатора, а также действительным INTEGER литералом.

[Не вдаваясь в подробности, как вы могли бы получить такое имя идентификатора] Предположим, что я хочу создать временную таблицу с именем 123456e6.

Нет ОШИБКИ на обратных циклах.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

ОШИБКА, если вы не используете обратные ссылки.

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

Однако 123451a6 [* g15]

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

Это полностью, потому что 1234156e6 также является показательным номером.

8
ответ дан Ajax 15 August 2018 в 22:30
поделиться

Помимо всех (хорошо объясненных) ответов, не было упомянутых ниже, и я часто посещаю этот Q & amp; A.

В двух словах; MySQL думает, что вы хотите сделать математику в своей таблице / столбце и интерпретируете дефисы, такие как «электронная почта», как e минус mail.


Отказ от ответственности: Поэтому я думал, что добавлю это как ответ типа «FYI» для тех, кто совершенно не знаком с работой с базами данных, и которые могут не понимать уже описанные технические термины.

2
ответ дан Funk Forty Niner 15 August 2018 в 22:30
поделиться

В основном в Mysql, эти типы идентификаторов используются в запросах `, ", ' и ().

  1. " или ' используйте для включения строки как значения "26-01-2014 00:00:00" или '26-01-2014 00:00:00'. Этот идентификатор используется только для строковой неагрегатной функции, такой как now() or sum ,max и т. Д.
  2. ` использовать для включения таблицы таблицы или таблицы, например. выберите column_name из table_name, где id = '2'
  3. () используются только для того, чтобы просто заключить части запроса, например. выберите column_name из table_name где (id = '2' и gender = 'male') или name = 'rakesh'.
12
ответ дан marc_s 15 August 2018 в 22:30
поделиться

Одиночные кавычки должны использоваться для строковых значений, например, в списке VALUES ().

Backticks обычно используются для указания идентификатора, а также могут быть безопасны из-за случайного использования зарезервированных ключевых слов.

В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время записи запросов.

29
ответ дан Peter Mortensen 15 August 2018 в 22:30
поделиться

В MySQL есть два типа кавычек:

  1. ' для включения строковых литералов
  2. ` для включения идентификаторов, таких как имена таблиц и столбцов

И тогда есть ", который является частным случаем. Он может быть использован для one вышеупомянутых целей за раз в зависимости от сервера MySQL sql_mode :

  1. By по умолчанию символ " может использоваться для вложения строковых литералов точно так же, как '
  2. В режиме ANSI_QUOTES символ " может использоваться для заключите идентификаторы так же, как `

Следующий запрос приведет к различным результатам (или ошибкам) ​​в зависимости от режима SQL:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES disabled

Запрос будет выбирать строковый литерал "column", где column foo равен строке "bar"

ANSI_QUOTES enabled

В запросе будет выбран столбец column где столбец foo равен столбцу bar

. Когда использовать

  • , я предлагаю вам избегать использования ", чтобы ваш код не зависел от SQL mode
  • Всегда указывайте идентификаторы, так как это хорошая практика (довольно много вопросов о SO обсуждают это)
97
ответ дан Salman A 15 August 2018 в 22:30
поделиться

В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время написания запросов.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Теперь предположим, что вы используете прямую переменную post в MySQL-запросе, тогда используйте ее следующим образом:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

Это лучшая практика для использования переменных PHP в MySQL.

10
ответ дан vipul sorathiya 15 August 2018 в 22:30
поделиться
  • 1
    Поэтому двойные кавычки являются гибкими, но не могут использоваться в качестве идентификаторов. – rhavendc 31 May 2016 в 08:39
  • 2
    Никогда не используйте прямое использование пользовательского ввода в запросе! – jankal 27 December 2016 в 10:13
  • 3
    @jankal Это просто пример. Я указал, что если вы используете прямой пользовательский ввод, тогда n тогда ........... – vipul sorathiya 28 December 2016 в 09:01
  • 4
    @vipulsorathiya Пожалуйста, укажите в своем ответе, что переменные POST должны быть экранированы. Теперь вы указываете на их использование в своем запросе. Плохо для начинающих, которые пробуют это ... – RFLdev 16 August 2017 в 12:18
Другие вопросы по тегам:

Похожие вопросы: