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?
それぞれの一重引用符をそれらのうちの2つに置き換えるだけです。
SELECT 'This is Ashok''s Pen.';
または、円記号でエスケープします。
SELECT 'This is Ashok\'s Pen.'
'はエスケープ文字です。したがって、文字列は次のようになります。
これはアショクです』ペン
フロントエンドコードを使用している場合は、データをストアドプロシージャに送信する前に、文字列の置換を行う必要があります。
たとえば、C#では次のことができます
value = value.Replace("'", "''");
次に、値をストアドプロシージャに渡します。
「MySQLで文字をエスケープする方法」に対する私の答えを参照してください
MySQLとの通信に使用しているライブラリには、エスケープ関数が組み込まれています。たとえば、PHPでは、mysqli_real_escape_stringまたはPDO::quoteを使用できます。
このコードを使用します:
<?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();
これを行う別の方法がありますが、あなたの視点に応じて、より安全な場合とそうでない場合があります。特定の文字列関数を使用するため、MySQL5.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
'));
これは文句なしに挿入され、文字列内のテキストを手動でエスケープする必要はありませんでした。
文字を使用して特殊文字をエスケープする必要があり\
ます。
This is Ashok's Pen.
になる:
This is Ashok\'s Pen.
データベースにアポストロフィを保持したい場合(')
は、以下のコードを使用してください。
$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);
?>
このコードを使用できます、
<?php
$var = "This is Ashok's Pen.";
addslashes($var);
?>
mysqli_real_escape_string()が機能しない場合。
PHPを使用している場合は、addslashes()関数を使用するだけです。
$var = mysqli_real_escape_string($conn, $_POST['varfield']);
プログラムでアクセスする場合は、プレースホルダーを使用して、安全でない文字を自動的にエスケープできます。
たとえば、Perl DBIでは、次を使用できます。
my $string = "This is Ashok's pen";
$dbh->do("insert into my_table(my_string) values(?)",undef,($string));
QUOTE
たぶん、MySQLマニュアルの関数を見ることができます。
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のテキストフィールドを問題なく挿入または更新できるようにします。
同様の関数がすべてのプログラミング言語にあります!
addlahes()またはmysql_real_escape_string()のいずれかを使用します。
これは、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 <a href="http://adidas.com/">adidas.com</a>.</p>
terms: '<p>adidas Gift Cards may be redeemed for merchandise on <a href="http://adidas.com/">adidas.com</a> 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, "\\\"");
'と"のすべての(すべての)出現に\エスケープ文字を追加します
問題を解決するための正しい/専門的な方法かどうかわからない
うまくいくと思いますが、実際のコンテンツでは、一重引用符と二重引用符はすべて\文字に置き換えられます
Pythonユーザーとして、引用符を生の「'」に置き換えます。
don_not_work_str = "This is Ashok's Pen."
work_str = don_not_work_str.replace("'", r"\'")