web-dev-qa-db-ja.com

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

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

This is Ashok's Pen.

一重引用符は問題を引き起こします。他のエスケープ文字が存在する場合があります。

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

91
Ashok Gupta

簡単に言えば:

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

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

または:

SELECT 'This is Ashok\'s Pen.'

エスケープ=)

111
Rob

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

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

9
Paul Dixon

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

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

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

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

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

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

8
Rashmi Pandit

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

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

    mysql_real_escape_string($var);
?>

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

7
user3818708

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

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

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

「ああ」、ほとんど頭のないニックは優雅な手を振った。 '-"

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

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

JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K

Base64エンコードに関するいくつかの注意:

  1. Base64-encodingはバイナリエンコーディングであるため、MySQLはBase64でエンコードされた文字列をバイトにデコードし、それらを解釈します。 base64とMySQLが文字エンコーディングとは何かに同意することを確認してください(UTF-8をお勧めします)。
  2. Stack Overflowで読みやすくするために、文字列を50列にラップしました。必要な数の列にラップできます(またはまったくラップしなくてもかまいません)。

次に、これをMySQLにロードします。

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD
JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS
MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG
dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ
SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj
JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr
Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn
VkSE1uSUMwaUlBPT0K
'));

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

6

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

This is Ashok's Pen.

になる:

This is Ashok\'s Pen.
5
simon622

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);
?>
3
Marcel Verwey

データベースにアポストロフィ( ')を保持する場合は、以下のコードを使用します

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

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

3
Dheeraj singh

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

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

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

3
Devil

PHPを使用している場合は、addslashes()関数を使用します。

PHPマニュアルはスラッシュを追加

1
Sonu
$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)); 
0
Elle Fie

Addslahes()またはmysql_real_escape_string()を使用します。

0
Anthony

MySQLマニュアルの関数 QUOTE を見ることができます。

0
Julian

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

同様の機能は、すべてのプログラミング言語にあります!

0
user7276516