独学で勉強している初心者の私は、自分で大きな問題を作り出してしまいました。データベースにデータを挿入する前に、文字列中のアポストロフィ(')をダブルクォート("")に変換していたのですが、実際にはMySQLが要求するバックスラッシュとアポストロフィ( \' )が必要でした。
私のテーブルが20万行以上になる前に、この問題をすぐに修正するのが最善だと思いました。そこで、いろいろ調べてみると、SQLのREPLACE関数が見つかりました。これは素晴らしいのですが、今、混乱しています。
ASPでは、こんなことをやっていました。
str = Replace(str,"'","""")
SQL Workbenchでデータベースを見ると、変換した記号がシングルクォート(")になっていて、ちょっと混乱しています。なぜダブルからシングルに変わったのかは理解できるのですが、今、どちらを変えればいいのかがわかりません。
SQL REPLACEを使った私の問題を解決するには、シングルクォート(")をバックスラッシュとアポストロフィに変換するか、ダブルクォート("")をバックスラッシュとアポストロフィに変換するか、どちらかでしょうか。
例えば、これです。
SQL = " SELECT REPLACE(myColumn,"""","\'") FROM myTable "
とか、これとか。
SQL = " SELECT REPLACE(myColumn,""","\'") FROM myTable "
私は自分自身をうまく説明することを願っています、任意の提案は、いつものようにありがたく受信します。私の質問について何か質問があれば、コメントください。
ありがとうございます
**-- を更新しました。
以下のクエリを試しましたが、データ内の( " )を変更することができません。
SELECT REPLACE(caption,'\"','\'') FROM photos WHERE photoID = 3371
SELECT REPLACE(caption,'"','\'') FROM photos WHERE photoID = 3371
SELECT REPLACE(caption,'""','\'') FROM photos WHERE photoID = 3371
それでも、検索すれば。
SELECT COUNT(*) FROM photos WHERE caption LIKE '%"%'
16,150列が表示されるんです。
-- アップデート2 --。
さて、私は 'workaround' を作成しました。このSQLを使って、ASPスクリプトを書いて、かなり早く列全体を変換することに成功しました。
SELECT photoID, caption FROM photos WHERE caption LIKE '%""%';
を、ASPでやってみた。
caption = Replace(caption,"""","\'")
しかし、なぜSQLで実現できなかったのか、その理由を知りたいのです。
以下の文字を置き換えます。
~ ! @ # $ % ^ & * ( ) _ +
` - =
{ } |
[ ] \
: "
; '
< > ?
, .
このSQLを使用します。
SELECT note as note_original,
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(note, '\"', ''),
'.', ''),
'?', ''),
'`', ''),
'<', ''),
'=', ''),
'{', ''),
'}', ''),
'[', ''),
']', ''),
'|', ''),
'\'', ''),
':', ''),
';', ''),
'~', ''),
'!', ''),
'@', ''),
'#', ''),
'$', ''),
'%', ''),
'^', ''),
'&', ''),
'*', ''),
'_', ''),
'+', ''),
',', ''),
'/', ''),
'(', ''),
')', ''),
'-', ''),
'>', ''),
' ', '-'),
'--', '-') as note_changed FROM invheader