2011-10-12 36 views
40

Là một newbie tự học, tôi đã tạo ra một vấn đề lớn cho bản thân mình. Trước khi chèn dữ liệu vào cơ sở dữ liệu của tôi, tôi đã chuyển đổi dấu nháy đơn (') trong một chuỗi, thành dấu ngoặc kép (""), thay vì dấu gạch chéo ngược và dấu nháy đơn (\') mà MySQL thực sự yêu cầu.MySQL - Thay thế ký tự trong các cột

Trước khi bảng của tôi phát triển hơn 200.000 hàng nó đã có, tôi nghĩ tốt nhất là khắc phục vấn đề này ngay lập tức. Vì vậy, tôi đã làm một số nghiên cứu và tìm thấy hàm SQL REPLACE, điều này thật tuyệt vời, nhưng bây giờ tôi đã nhầm lẫn.

Trong ASP, tôi đã làm điều này:

str = Replace(str,"'","""") 

Nếu tôi nhìn vào cơ sở dữ liệu của tôi trong SQL Workbench, biểu tượng tôi chuyển đổi hiện nay là một dấu nháy đơn ("), trong đó đã nhầm lẫn cho tôi một chút tôi. hiểu lý do tại sao nó thay đổi từ đôi thành duy nhất, nhưng tôi không biết tôi muốn thay đổi cái nào bây giờ.

Để khắc phục và khắc phục sự cố bằng cách sử dụng SQL REPLACE, bây giờ tôi chuyển đổi dấu nháy đơn (") để dấu gạch chéo và dấu nháy đơn (\ ') hoặc tôi chuyển đổi dấu ngoặc kép ("") thành dấu gạch chéo và dấu nháy đơn (\')?

Ví dụ này:

SQL = " SELECT REPLACE(myColumn,"""","\'") FROM myTable " 

hay này:

SQL = " SELECT REPLACE(myColumn,""","\'") FROM myTable " 

Tôi hy vọng tôi đã giải thích bản thân mình tốt, bất cứ đề nghị biết ơn nhận như mọi khi. Mọi thắc mắc về câu hỏi của tôi, xin hãy bình luận.

Rất cám ơn

- CẬP NHẬT -

Tôi đã thử các truy vấn sau đây nhưng vẫn không thay đổi (") trong các dữ liệu:

SELECT REPLACE(caption,'\"','\'') FROM photos WHERE photoID = 3371 
SELECT REPLACE(caption,'"','\'') FROM photos WHERE photoID = 3371 
SELECT REPLACE(caption,'""','\'') FROM photos WHERE photoID = 3371 

Tuy nhiên, nếu tôi tìm kiếm:

SELECT COUNT(*) FROM photos WHERE caption LIKE '%"%' 

Tôi nhận được 16.150 hàng.

- CẬP NHẬT 2-

Vâng, tôi đã tạo ra một 'workaround'. Tôi quản lý để chuyển đổi toàn bộ một cột khá nhanh chóng viết một kịch bản ASP, sử dụng SQL này:

SELECT photoID, caption FROM photos WHERE caption LIKE '%""%'; 

và sau đó trong ASP tôi đã làm:

caption = Replace(caption,"""","\'") 

Nhưng tôi vẫn muốn biết tại sao tôi couldn' t đạt được điều đó với SQL?

+2

Bạn thực sự cần phải đọc về sử dụng Paramater truy vấn đã được thêm. Điều này sẽ giữ cho bạn khỏi làm cho ứng dụng của bạn dễ bị tấn công SQL Injection –

+0

Lưu ý rằng trong 'ASP', sử dụng' "" "" 'ám như một giá trị của một dấu nháy đơn (' "'), không phải là một dấu ngoặc kép ('" "'), bởi vì bên trong của một chuỗi, một trích dẫn được biểu diễn (thoát) bởi hai dấu ngoặc kép – mellamokb

+0

Đó là danh sách tiếp theo trong danh sách của tôi để tìm hiểu John, vâng, tôi có một hàm biểu thức chính quy để kiểm tra các giá trị đầu vào và truy vấn cho nội dung độc hại. Tôi chắc chắn rằng đó không phải là an toàn ... – TheCarver

Trả lời

102

Chỉ cần chạy câu lệnh SELECT sẽ không ảnh hưởng đến dữ liệu. Bạn phải sử dụng một tuyên bố UPDATE với REPLACE để thực hiện thay đổi xảy ra:

UPDATE photos 
    SET caption = REPLACE(caption,'"','\'') 

Đây là một mẫu làm việc: http://sqlize.com/7FjtEyeLAh

+3

Cảm ơn rất nhiều !! Tôi nhận được nó ngay bây giờ, chọn sẽ in chuyển đổi nhưng cập nhật thực sự sẽ cập nhật DB ... – TheCarver

+0

@ MartinG: Bạn đã nhận nó! – mellamokb

+0

Để kiểm tra mà không cần thay đổi DB, hãy thử trước: 'CHỌN * TỪ ảnh TÌM ĐỊA PHƯƠNG ('"', '\')> 0' – Silvan

0

Nếu bạn có "thứ gì đó" và cần 'thứ gì đó', hãy sử dụng replace(col, "\"", "\'") và ngược lại.

+0

Điều đó không có tác dụng, tôi chạy nó trên một hàng, kiểm tra hàng và nó vẫn chứa (") – TheCarver

+0

SUBSTRING (dữ liệu, 1, LEN (dữ liệu)) -i ' m không chắc chắn nếu nó là 1 hoặc 2 trong tham số, nhưng điều này sẽ cắt đầu tiên và char cuối cùng từ một chuỗi, vì vậy "bất cứ điều gì" hoặc "bất cứ điều gì", nên đầu ra như bất cứ điều gì. – Jaxedin

+0

Thật không may, tôi có dữ liệu như [Kate Moss's], [O'Sullivan] và ['whatever'] – TheCarver

1

có thể tôi sẽ thực hiện điều này.

SQL = SELECT REPLACE(myColumn, '""', '\'') FROM myTable 

Tôi đã sử dụng các truy vấn đơn vì đó là ký tự đăng ký biểu thức chuỗi trong MySQL hoặc tôi tin tưởng.

Hy vọng điều đó sẽ hữu ích.

+0

Tôi chạy nó trên một hàng, kiểm tra hàng sau và nó vẫn còn ("). Tôi đang chỉnh sửa câu hỏi để hiển thị cho bạn các biến thể khác mà tôi đã thử – TheCarver

+0

chú thích có các giá trị khác ngoài dấu ngoặc kép không? – Nathan

+0

Chú thích mẫu [Brad Pitt đang mặc bộ bikini của Angelina Jolie] – TheCarver

10

Thay dưới ký tự

~ ! @ # $ %^& * () _ + 
` - = 
{ } | 
[ ] \ 
: " 
; ' 

< > ? 
, . 

với SQL này

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 
+14

tuyệt vời ... người ta nên lưu nó :) –

+7

Câu trả lời hay nhất mà tôi từng đọc trong SO – rikpg

+0

** ⁣⁣⁣ (⁣⁣⁣⊙⁣⁣⁣.⁣⁣⁣☉⁣⁣⁣) ⁣⁣⁣⁣⁣ ** – c24w

Các vấn đề liên quan