回答:
'はエスケープ文字です。したがって、文字列は次のようになります。
これはアショクのペンです
フロントエンドコードを使用している場合は、データをストアドプロシージャに送信する前に文字列を置き換える必要があります。
たとえば、C#では次のことができます
value = value.Replace("'", "''");
次に、ストアドプロシージャに値を渡します。
''
(2つの単一引用符)は、単一引用符文字を「エスケープ」するために許可されている特別な代替手段です。
「MySQLで文字をエスケープする方法」に対する私の回答を参照してください
MySQLとの通信に使用しているライブラリには、エスケープ関数が組み込まれています。たとえば、PHPでは、mysqli_real_escape_stringまたはPDO :: quoteを使用できます。
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.
。
準備済みステートメントを使用する場合、ドライバーはエスケープを処理します。例(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();
このコードを使用してください:
<?php
$var = "This is Ashok's Pen.";
mysql_real_escape_string($var);
?>
データベースは文字列の特殊文字を検出できないため、これで問題が解決します。
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.
。
あなたの視点に応じて、これを行うには別の方法があります。特定の文字列関数を使用するため、MySQL 5.6以降が必要ですFROM_BASE64
。
挿入したいメッセージがあるとしましょう:
「ああ」ほぼヘッドレスニックが優雅な手を振った、「重要ではない問題です...本当に参加したかったわけではありません。。。。私は応募したいと思いましたが、明らかに要件を満たしていません'-"
その引用には一重引用符と二重引用符がたくさんあり、MySQLに挿入するのは本当に大変です。プログラムからそれを挿入する場合、引用符などをエスケープするのは簡単です。しかし、SQLスクリプトに挿入する必要がある場合は、テキストを編集する必要があります(引用符をエスケープするため)。これにより、エラーが発生しやすくなります。またはワードラッピングなどに敏感
代わりに、テキストをBase64エンコードできるため、「クリーン」な文字列が得られます。
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
Base64エンコードに関する注意事項:
base64
MySQLが文字エンコーディングとは何かに同意するして(UTF-8をお勧めします)。これをMySQLにロードするには:
INSERT INTO my_table (text) VALUES (FROM_BASE64('
SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));
これにより文句なしに挿入され、文字列内のテキストを手動でエスケープする必要はありませんでした。
( ')アポストロフィをデータベースに保持したい場合は、以下のコードを使用してください
$new_value = str_replace("'","\'", $value);
$ new_valueはデータベースに保存できます。
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);
?>
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
PHPを使用している場合は、addslashes()関数を使用します。
addlahes()またはmysql_real_escape_string()を使用します。
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を使用する方法:
「エスケープする」TheString:
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でテキストフィールドを問題なく挿入または更新できるようにします。
同様の関数がすべてのプログラミング言語にあります!