116

How do I insert a value in MySQL that consist of single or double quotes. i.e

This is Ashok's Pen.

The single quote will create problems. There might be other escape characters.

How do you insert the data properly?

4

18 に答える 18

143

それぞれの一重引用符をそれらのうちの2つに置き換えるだけです。

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

または、円記号でエスケープします。

SELECT 'This is Ashok\'s Pen.'
于 2009-05-20T09:31:57.870 に答える
12

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

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

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

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

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

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

于 2009-05-20T09:30:08.013 に答える
9

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

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

于 2009-05-20T09:33:16.307 に答える
9

このコードを使用します:

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

    mysql_real_escape_string($var);
?>

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

于 2014-07-12T16:19:42.037 に答える
8

プリペアドステートメントを使用する場合、ドライバはエスケープを処理します。例(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();
于 2013-05-23T09:56:54.443 に答える
6

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

挿入したい次のメッセージがあるとします。

「ああ」ほとんど首なしニックが優雅な手を振った「重要なことではない。....本当に参加したかったわけではない。 '-"

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

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

SWtGb0xDSWdUbVZoY214NUlFaGxZV1JzWlhOeklFNXBZMnNnZD JGMlpXUWdZVzRnWld4bFoyRnVkQ0JvWVc1a0xDQWlZU0J0WVhS MFpYCklnYjJZZ2JtOGdhVzF3YjNKMFlXNWpaUzRnTGlBdUlDNG dTWFFuY3lCdWIzUWdZWE1nZEdodmRXZG9JRWtnY21WaGJHeDVJ SGRoYm5SbApaQ0IwYnlCcWIybHVMaUF1SUM0Z0xpQlVhRzkxWj JoMElFa25aQ0JoY0hCc2VTd2dZblYwSUdGd2NHRnlaVzUwYkhr Z1NTQW5aRzl1SjMKUWdablZzWm1sc2JDQnlaWEYxYVhKbGJXVn VkSE1uSUMwaUlBPT0K

Base64エンコーディングに関する注意事項:

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

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

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

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

于 2017-02-16T20:18:33.380 に答える
5

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

This is Ashok's Pen.

になる:

This is Ashok\'s Pen.
于 2009-05-20T09:34:06.650 に答える
5

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

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

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

于 2017-04-27T19:48:01.923 に答える
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);
?>
于 2013-11-06T17:56:14.150 に答える
3

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

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

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

于 2017-03-10T13:27:51.207 に答える
1

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

PHPマニュアルの追加ラッシュ

于 2013-11-27T12:37:15.250 に答える
1
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
于 2016-11-22T10:44:08.073 に答える
0

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

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

my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string)); 
于 2013-05-22T23:40:37.807 に答える
0

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

于 2015-12-04T08:40:08.530 に答える
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のテキストフィールドを問題なく挿入または更新できるようにします。

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

于 2016-12-10T12:47:28.693 に答える
0

addlahes()またはmysql_real_escape_string()のいずれかを使用します。

于 2018-04-19T11:25:27.070 に答える
0

これは、API応答としての私のデータがどのように見えるかであり、MYSQLデータベースに保存したいと思います。引用符、HTMLコードなどが含まれています。

例:-

{

rewardName: "Cabela's eGiftCard $25.00",

shortDescription: '<p>adidas gift cards can be redeemed in over 150 adidas Sport Performance, adidas Originals, or adidas Outlet stores in the US, as well as online at&nbsp;<a href="http://adidas.com/">adidas.com</a>.</p>

terms: '<p>adidas Gift Cards may be redeemed for merchandise on&nbsp;<a href="http://adidas.com/">adidas.com</a>&nbsp;and in adidas Sport Performance, adidas Originals, and adidas Outlet stores in the United States.'

}

解決

CREATE TABLE `brand` (
`reward_name` varchar(2048),
`short_description` varchar(2048),
`terms` varchar(2048),  
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;

挿入中、JSON.stringify()が続きます

    let brandDetails= {
    rewardName: JSON.stringify(obj.rewardName),  
    shortDescription: JSON.stringify(obj.shortDescription),
    term: JSON.stringify(obj.term),
     }

上はJSONオブジェクトで、下はMySQLにデータを挿入するSQLクエリです。

let query = `INSERT INTO brand (reward_name, short_description, terms) 
VALUES (${brandDetails.rewardName}, 
(${brandDetails.shortDescription}, ${brandDetails.terms})`;

それはうまくいった....

ここに画像の説明を入力してください

何も機能しない場合は、これを試してください:

var res = str.replace(/'/g, "\\'");
var res = res.replace(/"/g, "\\\"");

'と"のすべての(すべての)出現に\エスケープ文字を追加します

問題を解決するための正しい/専門的な方法かどうかわからない

うまくいくと思いますが、実際のコンテンツでは、一重引用符と二重引用符はすべて\文字に置き換えられます

于 2021-06-21T04:10:51.930 に答える
0

Pythonユーザーとして、引用符を生の「'」に置き換えます。

don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")
于 2021-12-30T02:38:23.360 に答える