MySQL'e tek veya çift tırnaktan oluşan bir değeri nasıl eklerim? yani
This is Ashok's Pen.
Tek alıntı sorun yaratacaktır. Başka kaçış karakterleri olabilir.
Verileri doğru şekilde nasıl eklersiniz?
MySQL'e tek veya çift tırnaktan oluşan bir değeri nasıl eklerim? yani
This is Ashok's Pen.
Tek alıntı sorun yaratacaktır. Başka kaçış karakterleri olabilir.
Verileri doğru şekilde nasıl eklersiniz?
Yanıtlar:
Basitçe söylemek gerekirse:
SELECT 'This is Ashok''s Pen.';
Yani dizenin içinde, her bir alıntıyı ikisiyle değiştirin.
Veya:
SELECT 'This is Ashok\'s Pen.'
Escape it =)
'kaçış karakteridir. Yani dizeniz şöyle olmalıdır:
Bu Ashok'un Kalemi
Bazı ön uç kodları kullanıyorsanız, verileri saklı yordama göndermeden önce bir dize değiştirme yapmanız gerekir.
Örneğin, C # ile şunları yapabilirsiniz:
value = value.Replace("'", "''");
ve sonra değeri saklı yordama iletir.
''
(iki tek tırnak), bir tek tırnak karakterinden "kaçmak" için izin verilen özel bir alternatiftir.
"MySQL'de karakterlerden nasıl kaçılırım" sorusuna cevabıma bakın
MySQL ile konuşmak için hangi kütüphaneyi kullanıyor olursanız olun, yerleşik bir kaçış işlevine sahip olacaktır, örneğin PHP'de mysqli_real_escape_string veya PDO :: quote kullanabilirsiniz.
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
.
Hazırlanmış ifadeleri kullanırsanız, sürücü herhangi bir kaçışla ilgilenecektir. Örneğin (Java):
Connection conn = DriverManager.getConnection(driverUrl);
conn.setAutoCommit(false);
PreparedStatement prepped = conn.prepareStatement("INSERT INTO tbl(fileinfo) VALUES(?)");
String line = null;
while ((line = br.readLine()) != null) {
prepped.setString(1, line);
prepped.executeQuery();
}
conn.commit();
conn.close();
Bu kodu kullanın:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
Bu, sorununuzu çözecektir, çünkü veritabanı bir dizenin özel karakterlerini algılayamaz.
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
.
Bakış açınıza bağlı olarak, bunu yapmanın daha güvenli olabilecek ya da olmayabilecek başka bir yolu vardır. Bu MySQL 5.6 veya sonrası çünkü belirli bir dize fonksiyonunun kullanımı gerektirir: FROM_BASE64
.
Diyelim ki eklemek istediğiniz bu mesaj elinizde:
"Ah," Neredeyse Kafasız Nick zarif bir el salladı, "önemsiz bir mesele ... Sanki gerçekten katılmak istemiyordum ... ... Başvurabilirim sandım, ama görünüşe göre 'gereksinimleri karşılamıyorum '- "
Bu alıntıda bir sürü tek ve çift tırnak vardır ve MySQL'e eklemek gerçek bir acı olacaktır. Bunu bir programdan ekliyorsanız, tırnak işaretlerinden kaçmak kolaydır, vb. Ancak, bunu bir SQL betiğine koymanız gerekiyorsa, metni düzenlemeniz gerekir (tırnak işaretlerinden kaçmak için), bu da hataya açık olabilir. veya kelime kaydırmaya vb. duyarlı
Bunun yerine, metni Base64 olarak kodlayabilirsiniz, böylece "temiz" bir dizeye sahip olursunuz:
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Base64 kodlamasıyla ilgili bazı notlar:
base64
MySQL'in karakter kodlamasının ne olduğu konusunda hemfikir olduğundan emin olun (UTF-8'i öneririm).Şimdi, bunu MySQL'e yüklemek için:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
Bu, herhangi bir şikayet olmadan eklenecektir ve dize içindeki herhangi bir metinden manuel olarak çıkmanız gerekmedi.
PHP'de mysqli_real_escape_string kullanın .
PHP Kılavuzundan Örnek:
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
mysqli_query($link, "CREATE TEMPORARY TABLE myCity LIKE City");
$city = "'s Hertogenbosch";
/* this query will fail, cause we didn't escape $city */
if (!mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
printf("Error: %s\n", mysqli_sqlstate($link));
}
$city = mysqli_real_escape_string($link, $city);
/* this query with escaped $city will work */
if (mysqli_query($link, "INSERT into myCity (Name) VALUES ('$city')")) {
printf("%d Row inserted.\n", mysqli_affected_rows($link));
}
mysqli_close($link);
?>
(')
Veritabanında kesme işaretini tutmak istiyorsanız, aşağıdaki kodu kullanın:
$new_value = str_replace("'","\'", $value);
$new_value
veritabanında saklayabilir.
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
PHP kullanıyorsanız, sadece addslashes () işlevini kullanın.
Programlı erişim için, güvenli olmayan karakterlerden sizin için otomatik olarak çıkış yapmak üzere yer tutucular kullanabilirsiniz .
Örneğin Perl DBI'da şunları kullanabilirsiniz:
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
Addslahes () veya mysql_real_escape_string () kullanın.
This, mysql_real_escape_string() extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
.
Delphi'yi kullanarak yaptığım yol:
TheString to "escape":
TheString=" bla bla bla 'em some more apo:S 'em and so on ";
Çözüm:
StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
Sonuç:
TheString=" bla bla bla \'em some more apo:S \'em and so on ";
Bu işlev tüm Char (39) 'ı "\'" ile değiştirerek MySQL'de herhangi bir sorun olmadan metin alanları eklemenize veya güncellemenize izin verir.
Tüm programlama dillerinde benzer işlevler bulunur!