Як уникнути апострофа (') у MySql?


146

Документація MySQL говорить, що так і має бути \'. Однак і scite, і mysql показують, що це ''працює. Я це бачив і це працює. Що я повинен зробити?


Ви говорите про те, ''чи \'це правильно?
Раптор

\'специфічний MySQL, а ''сумісний з ANSI SQL, якщо я не помиляюся
apokryfos

Залежно від реалізації SQL; - '' \ '', '\' ', а іноді' [']' 'дозволить вийти з коду. Крім цього, будь-яка кількість замінників unicode 'обійде цю перевірку. Вся гра тут зловживає якістю '' базування на основі '', що вимагає, щоб остаточний підрахунок був рівним, а не непарним. Якщо це закінчується непарним шляхом перемішування декількох методів втілення один в одного, ви можете перемогти пробіг та ввести сирий SQL. Мораль історії: НІКОЛИ не використовуйте рядкову інтерполяцію, ВЖЕ завжди використовуйте підготовлені заяви.
Шейн

Відповіді:


185

Документація MySQL, яку ви цитуєте, насправді говорить трохи більше, ніж ви згадуєте. Це також говорить,

" '" Всередині рядка, цитованого " '", може бути записано як " ''".

(Крім того, ви пов’язані з версією MySQL 5.0 таблиці 8.1. Послідовності втечі спеціальних символів ; поточна версія - 5.6 - але поточна Таблиця 8.1. Послідовності втечі спеціальних символів виглядає досить схоже.)

Я думаю, що примітка Postgres про backslash_quote (string)параметр є інформативною:

Це контролює, чи можна позначити лапки \'в прямому рядку. Кращим, стандартним способом подання позначення лапки є подвоєння його ( ''), але PostgreSQL історично також прийнято \'. Однак використання \'створює ризики для безпеки ...

Це говорить мені, що використання подвоєного символу з одною цитатою є кращим загальним та довгостроковим вибором, ніж використання зворотної косої риси для виходу з одноцитати.

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


42

Стандартний SQL використовує подвоєні котирування; MySQL повинен прийняти це, щоб бути розумно сумісним.

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

+1. Звідки йдеться про те, що його слід уникати
user4951

У ньому написано "може", а не "повинно", але інформація є там (під таблицею): Є кілька способів включити символи цитати в рядок: " '" всередині рядка, що цитується " '", може бути записано як " ''" . " "" Всередині рядка, цитованого " "", може бути записано як " """. Попередьте символ цитування символом втечі ("` `").
Джонатан Леффлер

1
Це найкращий спосіб уникнути апострофа, подвоївши його.
Алекс _TNT

10

Я вважаю, що користувач2087510 мав на увазі:

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

Я також використовував це з успіхом.


1
Працювали для мене, поки цих найвищих відповідей не було
Джаред

1
чому \\ ', а не \'?
біням

@biniam_Ethiopia другий \ уникає першого
Juha Untinen

2
можливе питання безпеки. може отримати ін'єкцію sql, якщо рядок уже містить \ ', тож ви вставляєте \, який тепер знаходиться у рядку як \\', який завершить рядок. Використовуйте замість name.replace ("'", "' '")
Гарр Годфрі

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. Використовуйте символ втечі \перед єдиною цитатою' :'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 вихід.
Гріндлей
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.