MySQLで単一引用符をエスケープする方法


98

単一引用符または二重引用符で構成される値をMySQLに挿入するにはどうすればよいですか。すなわち

This is Ashok's Pen.

一重引用符は問題を引き起こします。他のエスケープ文字があるかもしれません。

どのようにデータを適切に挿入しますか?


回答:


126

簡単に言えば:

SELECT 'This is Ashok''s Pen.';

文字列内で、各単一引用符を2つに置き換えます。

または:

SELECT 'This is Ashok\'s Pen.'

エスケープする=)


9
投稿を更新して、可能な解決策としてmysql_real_escape_string()またはaddslashes()を含めることをお勧めします...以下のコメントの1つにあるように、OPは、ファイルから読み込んで挿入しているだけだと述べています。
ジェームズB

3
mysql_ *メソッドは非推奨であるため、将来の使用にはお勧めしません
hd1 2013年

これらの日の最良のオプションは、のいずれかを使用することですが、それは、正しい答えである
ライアン

10

'はエスケープ文字です。したがって、文字列は次のようになります。

これはアショクのペンです

フロントエンドコードを使用している場合は、データをストアドプロシージャに送信する前に文字列を置き換える必要があります。

たとえば、C#では次のことができます

value = value.Replace("'", "''");

次に、ストアドプロシージャに値を渡します。


データを手動で挿入するのではなく、ファイルから抽出すると、vaklues(Ashokのペン)が表示されます。挿入方法。これを行うための手順を作成しました。それを正しくする方法。
Ashok Gupta、

FWIWマイナーニット:バックスラッシュは「エスケープ文字」です。''(2つの単一引用符)は、単一引用符文字を「エスケープ」するために許可されている特別な代替手段です。
ToolmakerSteve

9

MySQLで文字をエスケープする方法」に対する私の回答を参照してください

MySQLとの通信に使用しているライブラリには、エスケープ関数が組み込まれています。たとえば、PHPでは、mysqli_real_escape_stringまたはPDO :: quoteを使用できます。


1
データを手動で挿入するのではなく、ファイルから抽出します。値があります。アショクのペンです。挿入方法。これを行うための手順を作成しました。それを正しくする方法
Ashok Gupta、

ただ、ノート、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.
NewBee

7

準備済みステートメントを使用する場合、ドライバーはエスケープを処理します。例(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();

7

このコードを使用してください:

<?php
    $var = "This is Ashok's Pen.";

    mysql_real_escape_string($var);
?>

データベースは文字列の特殊文字を検出できないため、これで問題が解決します。


1
ただ、ノート、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.
NewBee

6

あなたの視点に応じて、これを行うには別の方法があります。特定の文字列関数を使用するため、MySQL 5.6以降が必要ですFROM_BASE64

挿入したいメッセージがあるとしましょう:

「ああ」ほぼヘッドレスニックが優雅な手を振った、「重要ではない問題です...本当に参加したかったわけではありません。。。。私は応募したいと思いましたが、明らかに要件を満たしていません'-"

その引用には一重引用符と二重引用符がたくさんあり、MySQLに挿入するのは本当に大変です。プログラムからそれを挿入する場合、引用符などをエスケープするのは簡単です。しかし、SQLスクリプトに挿入する必要がある場合は、テキストを編集する必要があります(引用符をエスケープするため)。これにより、エラーが発生しやすくなります。またはワードラッピングなどに敏感

代わりに、テキストをBase64エンコードできるため、「クリーン」な文字列が得られます。

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Base64エンコードに関する注意事項:

  1. MySQLはBase64エンコードされた文字列をバイトにデコードし、それを解釈するため、Base64エンコードはバイナリエンコードであるため、エンコードを実行するときに文字セットが正しいことを確認することをお勧めします。必ずbase64MySQLが文字エンコーディングとは何かに同意するして(UTF-8をお勧めします)。
  2. Stack Overflowで読みやすくするために、文字列を50列にラップしました。必要に応じて任意の数の列にラップすることができ(またはまったくラップしない)、引き続き機能します。

これをMySQLにロードするには:

INSERT INTO my_table (text) VALUES (FROM_BASE64(' SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K '));

これにより文句なしに挿入され、文字列内のテキストを手動でエスケープする必要はありませんでした。


5

文字を使用して特殊文字をエスケープする必要があり\ます。

This is Ashok's Pen.

になる:

This is Ashok\'s Pen.

3

( ')アポストロフィをデータベースに保持したい場合は、以下のコードを使用してください

$new_value = str_replace("'","\'", $value); 

$ new_valueはデータベースに保存できます。


3

このコードを使用できます

<?php
     $var = "This is Ashok's Pen.";
     addslashes($var);
?>

mysqli_real_escape_string()が機能しない場合。


3

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);
?>



0

プログラムによるアクセスの場合、プレースホルダーを使用して、安全でない文字を自動的にエスケープできます。

たとえば、Perl DBIでは、以下を使用できます。

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 

0

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.
NewBee

うん、今すぐiを追加する必要があるmysqli_real_escape_string php.net/manual/en/mysqli.real-escape-string.php
Anthony

回答を更新することをお勧めします(たとえば、コメントはいつでも消える可能性があります)。
Peter Mortensen

0

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でテキストフィールドを問題なく挿入または更新できるようにします。

同様の関数がすべてのプログラミング言語にあります!


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.