Как избежать апострофа (') в MySql?


147

В документации MySQL сказано, что так и должно быть \'. Тем не менее, как Scite, так и MySQL показывает, что ''работает. Я видел это, и это работает. Что я должен делать?


Вы говорите о том ''или \'правильно?
Raptor

\'является специфичным для MySQL, в то время как ''является совместимым с ANSI SQL, если я не ошибаюсь
apokryfos

В зависимости от реализации SQL; - '' \ '', '\' ', а иногда и' [']' 'позволят выйти из кода. Кроме того, любое количество замен Unicode 'будет обходить эту проверку. Вся игра здесь злоупотребляет качеством побега, основанного на том, что окончательный счет должен быть четным, а не нечётным. Если это заканчивается странно, смешивая несколько методов перехода друг с другом, вы можете победить экранирование и ввести сырой SQL. Мораль истории: НИКОГДА не используйте интерполяцию строк, ВСЕГДА используйте готовые операторы.
Шейн

Ответы:


186

Документация MySQL, которую вы цитируете, на самом деле говорит немного больше, чем вы упоминаете. Это также говорит,

« '» Внутри строки, заключенной в « '», может быть написано как « ''».

(Кроме того, вы связались с версией Таблицы 8.1 для MySQL 5.0. Последовательности побега специальных символов , и текущая версия - 5.6, но текущая Таблица 8.1. Последовательности побега специальных символов выглядят очень похоже.)

Я думаю, что примечание Postgres по backslash_quote (string)параметру является информативным:

Это определяет, может ли кавычка быть представлена \'строковым литералом. Предпочтительный стандартный способ представления знака кавычки в SQL - это удвоение it ( ''), но PostgreSQL исторически также принимал это \'. Однако использование \'создает риски безопасности ...

Это говорит мне о том, что использование двойных одинарных кавычек является лучшим общим и долгосрочным выбором, чем использование обратной косой черты для экранирования одинарных кавычек.

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


42

Стандартный SQL использует двойные кавычки; MySQL должен принять это, чтобы быть разумно совместимым.

'He said, "Don''t!"'

+1. Где написано , что она должна быть замаскирована «» не dev.mysql.com/doc/refman/5.0/en/...
user4951

Он говорит «может», а не «должен», но информация есть (под таблицей): Есть несколько способов включить символы кавычки в строку: « '» внутри строки, заключенной в «' », может быть написано как « ''» , « "» Внутри строки, заключенной в « "», может быть написано как « ""». Перед символом кавычки должен стоять символ перехода («` `»).
Джонатан Леффлер

1
Это лучший способ избежать апострофа, удвоив его.
Алекс _TNT

10

Я считаю, что user2087510 имел в виду:

name = 'something'
name = name.replace("'", "\\'")

Я также использовал это с успехом.


1
Работал на меня, в то время как эти топовые ответы не дали
Джаред

1
почему \ "а не \"?
biniam

@biniam_Ethiopia второй \ ускользает от первого
Юха Унтинен,

2
возможная проблема безопасности. может получить инъекцию sql, если строка уже содержит \ ', поэтому вы вставляете \, который теперь находится в строке как \\', который завершит строку. Вместо этого используйте name.replace ("'", "' '")
Garr Godfrey

6

просто напишите ''вместо 'я имею в виду два раза'


1
используйте апостроф два раза вместо одного
MRRaja

5

Вот пример:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Просто используйте двойные кавычки, чтобы заключить одинарную кавычку.

Если вы настаиваете на использовании одинарных кавычек (и необходимости экранировать персонажа):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

Есть три способа, которые я знаю. Первый не самый красивый, а второй самый распространенный в большинстве языков программирования:

  1. Используйте еще одну цитату: 'I mustn''t sin!'
  2. Используйте escape-символ \перед одинарной кавычкой ':'I mustn\'t sin!'
  3. Используйте двойные кавычки, чтобы заключить строку вместо одинарных кавычек: "I mustn't sin!"

Моим личным предпочтением будет то, \'что он используется многими языками программирования, но ''поддерживается большим количеством диалектов SQL, поэтому использование варианта 1 лучше для совместимости. Sqlite, например, не работает с обратной косой чертой.
okdewit

0

Заменить строку

value = value.replace(/'/g, "\\'");

где значение - это ваша строка, которая будет храниться в вашей базе данных.

Дальше,

Пакет NPM для этого, вы можете посмотреть в него

https://www.npmjs.com/package/mysql-apostrophe


Пожалуйста, не размещайте какой-либо инструмент или библиотеку в качестве ответа. По крайней мере, продемонстрируйте, как это решает проблему в самом ответе.
Baum mit Augen

Это не сработает. Вы забыли избежать вещей. заменить (/ \ '/ g, "\\\'")
Майкл

0

Я думаю, что если у вас есть данные с апострофом, вы можете добавить один апостроф перед апострофом

например. «Это место Джона»

Здесь MYSQL предполагает два предложения «Это место Джона»

Вы можете поставить «Это место Джона». Я думаю, что это должно работать таким образом.



0

Возможно, не по теме, но, возможно, вы пришли сюда в поисках способа очистки ввода текста из HTML-формы, чтобы при вводе текста в SQL пользователь не вводил ошибку таблица в БД. Есть несколько способов сделать это, и вы можете прочитать о внедрении SQL, но простой вариант в PHP - это использовать функцию htmlspecialchars (), которая преобразует все ваши апострофы, в 'которые, возможно, вы хотите сохранить тем не мение.


Кодировка не для хранения, а для отображения. Используйте готовые заявления.
mickmackusa

Я согласен, что подготовленные заявления являются золотым стандартом безопасности и надежности. Я выделил конкретный случай, когда вы можете сохранить текстовые данные в виде HTML, и в этом случае мой метод заключается не в том, чтобы использовать связанные параметры, а в том, чтобы вместо них использовать. HTML-вход, HTML-выход.
Grindlay
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.