Bagaimana cara menghindari tanda kutip (') di MySql?

147

The dokumentasi MySQL mengatakan bahwa itu harus \'. Namun, kedua scite dan mysql menunjukkan bahwa itu ''berfungsi. Saya melihat itu dan itu berhasil. Apa yang harus saya lakukan?

pengguna4951
sumber
Apakah Anda berbicara tentang benar ''atau \'tidak?
Raptor
\'adalah MySQL khusus sementara ''ANSI SQL compliant jika saya tidak salah
apokryfos
Bergantung pada implementasi SQL; - '' \ '', '\' ', dan terkadang' [']' 'akan memungkinkan keluar dari kode. Yang paling penting, sejumlah penggantian unicode akan melewati pemeriksaan ini. Seluruh permainan di sini menyalahgunakan kualitas melarikan diri berbasis '' yang membutuhkan hitungan final bahkan lebih daripada aneh. Jika berakhir aneh dengan menumbuk beberapa metode melarikan diri satu sama lain, Anda dapat mengalahkan melarikan diri dan menyuntikkan SQL mentah. Moral dari cerita: JANGAN PERNAH menggunakan interpolasi string, SELALU menggunakan pernyataan yang sudah disiapkan.
Shayne

Jawaban:

186

Dokumentasi MySQL yang Anda kutip sebenarnya mengatakan sedikit lebih banyak daripada yang Anda sebutkan. Ia juga mengatakan,

A " '" di dalam string yang dikutip dengan " '" dapat ditulis sebagai " ''".

(Juga, Anda ditautkan ke versi MySQL 5.0 dari Tabel 8.1. Sequence Escape Karakter Khusus , dan versi saat ini adalah 5.6 - tetapi Tabel 8.1 saat ini . Sequence Escape Karakter Khusus terlihat sangat mirip.)

Saya pikir catatan Postgres pada backslash_quote (string)parameter informatif:

Ini mengontrol apakah tanda kutip dapat diwakili oleh \'dalam string literal. Cara standar SQL yang disukai untuk mewakili tanda kutip adalah dengan menggandakannya ( '') tetapi PostgreSQL secara historis juga menerimanya \'. Namun, penggunaan \'menciptakan risiko keamanan ...

Yang mengatakan kepada saya bahwa menggunakan karakter kutipan tunggal dua kali lipat adalah pilihan keseluruhan dan jangka panjang yang lebih baik daripada menggunakan backslash untuk menghindari kutipan tunggal.

Sekarang jika Anda juga ingin menambahkan pilihan bahasa, pilihan database SQL dan kebiasaan non-standar, dan pilihan kerangka kerja kueri untuk persamaan, maka Anda mungkin berakhir dengan pilihan yang berbeda. Anda tidak memberi banyak informasi tentang kendala Anda.

Jim DeLaHunt
sumber
42

SQL standar menggunakan tanda kutip ganda; MySQL harus menerimanya agar memenuhi persyaratan.

'He said, "Don''t!"'
Jonathan Leffler
sumber
+1. Di mana dikatakan bahwa itu harus diloloskan oleh '' bukan dev.mysql.com/doc/refman/5.0/en/…
user4951
Dikatakan 'mungkin' daripada 'seharusnya', tetapi informasinya ada (di bawah tabel): Ada beberapa cara untuk memasukkan karakter kutipan dalam sebuah string: A " '" di dalam string yang dikutip dengan " '" dapat ditulis sebagai " ''" . A " "" di dalam string yang dikutip dengan " "" dapat ditulis sebagai " """. Awali karakter kutipan dengan karakter escape (“` `”).
Jonathan Leffler
1
Ini adalah cara terbaik untuk keluar dari tanda kutip dengan menggandakannya.
Alex _TNT
10

Apa yang saya percaya user2087510 maksudkan adalah:

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

Saya juga menggunakan ini dengan sukses.

pengguna3169788
sumber
1
Bekerja untuk saya sedangkan jawaban teratas tidak
Jared
1
mengapa \\ 'daripada \'?
biniam
@biniam_Ethiopia yang kedua \ lolos dari yang pertama
Juha Untinen
2
kemungkinan masalah keamanan. bisa mendapatkan injeksi sql jika string sudah mengandung \ ', jadi Anda memasukkan \, yang sekarang ada di string sebagai \\' yang akan mengakhiri string. Gunakan name.replace ("'", "' '") sebagai gantinya
Garr Godfrey
6

hanya menulis ''di tempat yang 'saya maksud dua kali'

MRRaja
sumber
1
gunakan tanda kutip dua kali menggantikan satu
MRRaja
5

Ini sebuah contoh:

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

Cukup gunakan tanda kutip ganda untuk melampirkan tanda kutip tunggal.

Jika Anda bersikeras menggunakan tanda kutip tunggal (dan kebutuhan untuk melarikan diri dari karakter):

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

Ada tiga cara yang saya ketahui. Yang pertama bukan yang tercantik dan yang kedua menjadi cara umum dalam kebanyakan bahasa pemrograman:

  1. Gunakan satu kutipan lagi: 'I mustn''t sin!'
  2. Gunakan karakter pelarian \sebelum kutipan tunggal' :'I mustn\'t sin!'
  3. Gunakan tanda kutip ganda untuk melampirkan string daripada tanda kutip tunggal: "I mustn't sin!"
Robert Rocha
sumber
Preferensi pribadi saya akan \'seperti yang digunakan oleh begitu banyak bahasa pemrograman, tetapi ''didukung oleh lebih banyak dialek SQL, jadi menggunakan opsi 1 lebih baik untuk kompatibilitas. Sqlite misalnya tidak bekerja dengan backslash lolos.
okdewit
0

Ganti string

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

di mana nilai adalah string Anda yang akan disimpan dalam Database Anda.

Lebih lanjut,

Paket NPM untuk ini, Anda bisa memeriksanya

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

Ashutosh Jha
sumber
Tolong jangan hanya memposting beberapa alat atau perpustakaan sebagai jawaban. Setidaknya tunjukkan bagaimana cara memecahkan masalah dalam jawaban itu sendiri.
Baum mit Augen
Itu tidak akan berhasil. Anda lupa melarikan diri. ganti (/ \ '/ g, "\\\'")
Michael
0

Saya pikir jika Anda memiliki titik data dengan apostrof Anda dapat menambahkan satu apostrof sebelum apostrof

misalnya. 'Ini adalah tempat milik John'

Di sini MYSQL mengasumsikan dua kalimat 'Ini adalah tempat John'

Anda dapat menempatkan 'Ini adalah tempat milik John'. Saya pikir itu harus bekerja seperti itu.

Priyanka Pandhi
sumber
0

Mungkin di luar topik, tetapi mungkin Anda datang ke sini mencari cara untuk membersihkan input teks dari formulir HTML, sehingga ketika pengguna memasukkan karakter tanda kutip, itu tidak menimbulkan kesalahan ketika Anda mencoba menulis teks ke SQL berbasis-tabel dalam DB. Ada beberapa cara untuk melakukan ini, dan Anda mungkin ingin membaca tentang injeksi SQL juga, tetapi opsi sederhana dalam PHP adalah dengan menggunakan fungsi htmlspecialchars () yang akan mengubah semua tanda kutip menjadi 'yang mungkin Anda ingin simpan bagaimanapun.

Grindlay
sumber
Pengkodean bukan untuk menyimpan, itu untuk menampilkan. Gunakan pernyataan yang disiapkan.
mickmackusa
Saya setuju bahwa pernyataan yang disiapkan adalah standar emas untuk keamanan dan keandalan. Saya menyoroti kasus tertentu di mana Anda mungkin ingin menyimpan data teks sebagai HTML, dalam hal ini metode saya selain menggunakan parameter terikat, bukan sebagai ganti. HTML masuk, HTML keluar.
Grindlay