単一引用符または二重引用符で構成される値をMySQLに挿入するにはどうすればよいですか。すなわち
This is Ashok's Pen.
一重引用符は問題を引き起こします。他のエスケープ文字が存在する場合があります。
どのようにデータを適切に挿入しますか?
簡単に言えば:
SELECT 'This is Ashok''s Pen.';
そのため、文字列内で、各単一引用符を2つに置き換えます。
または:
SELECT 'This is Ashok\'s Pen.'
エスケープ=)
「MySQLで文字をエスケープする方法」 への回答を参照してください。
MySQLとの通信に使用しているライブラリには、エスケープ機能が組み込まれています。 PHPでは、 mysqli_real_escape_string または PDO :: quote
'はエスケープ文字です。したがって、文字列は次のようになります。
これはアショクのペンです
フロントエンドコードを使用している場合は、データをストアドプロシージャに送信する前に文字列を置換する必要があります。
たとえば、C#では次のことができます。
value = value.Replace("'", "''");
次に、ストアドプロシージャに値を渡します。
このコードを使用してください:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
データベースは文字列の特殊文字を検出できないため、これにより問題が解決します。
準備済みステートメントを使用する場合、ドライバーはエスケープを処理します。例(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();
これを行う別の方法がありますが、これはあなたの視点に応じて、安全である場合と安全でない場合があります。特定の文字列関数 FROM_BASE64
を使用するため、MySQL 5.6以降が必要です。
挿入したいこのメッセージがあるとしましょう:
「ああ」、ほとんど頭のないニックは優雅な手を振った。 '-"
その引用には一重引用符と二重引用符がたくさんあり、MySQLに挿入するのは本当に苦痛です。プログラムから挿入する場合、引用符などを簡単にエスケープできます。ただし、SQLスクリプトに挿入する必要がある場合は、テキストを編集する必要があります(引用符をエスケープするため)。またはワードラップなどに敏感です。
代わりに、テキストをBase64エンコードできるため、「クリーン」な文字列が得られます。
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Base64エンコードに関するいくつかの注意:
base64
とMySQLが文字エンコーディングとは何かに同意することを確認してください(UTF-8をお勧めします)。次に、これをMySQLにロードします。
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
これは文句なしに挿入され、文字列内のテキストを手動でエスケープする必要はありませんでした。
\
文字を使用して特殊文字をエスケープする必要があります。
This is Ashok's Pen.
になる:
This is Ashok\'s Pen.
PHPでは、 mysqli_real_escape_string を使用します。
PHPマニュアルの例:
<?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);
?>
データベースにアポストロフィ( ')を保持する場合は、以下のコードを使用します
$new_value = str_replace("'","\'", $value);
$ new_valueはデータベースに保存できます。
このコードを使用できますが、
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
mysqli_real_escape_string()が機能しない場合。
PHPを使用している場合は、addslashes()関数を使用します。
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
プログラムによるアクセスの場合、 placeholders を使用して、安全でない文字を自動的にエスケープできます。
たとえば、Perl DBIでは、次を使用できます。
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
Addslahes()またはmysql_real_escape_string()を使用します。
MySQLマニュアルの関数 QUOTE
を見ることができます。
私が行う方法、Delphiを使用して:
「エスケープ」するストリング:
TheString=" bla bla bla 'em some more apo:S 'em and so on ";
解決:
StringReplace(TheString, #39,'\'+#39, [rfReplaceAll, rfIgnoreCase]);
結果:
TheString=" bla bla bla \'em some more apo:S \'em and so on ";
この関数は、すべてのChar(39)を「\ '」に置き換え、MySQLでテキストフィールドを問題なく挿入または更新できるようにします。
同様の機能は、すべてのプログラミング言語にあります!