查询以替换表中的特定字符

时间:2015-07-14 05:15:44

标签: mysql query-optimization

我的表包含许多字段。我想要的是创建一个查询,它将更新我的表中包含\'到\\\'的每个字段。对于一个字段,查询是

  

更新表集column1 = replace(column1,'\'','\\\'');

但如果我必须在所有字段中替换相同的内容,该怎么办?我是否必须为每个字段编写相同的查询?有没有办法写一个将更新所有字段的查询。

3 个答案:

答案 0 :(得分:1)

问:我是否必须为每个字段编写相同的查询?有没有办法编写一个更新所有字段的查询?

需要引用要更新的每个列。您可以在单个语句中更新多个列。 (你不必单独发表声明;一举更新它们会更有效率。

 UPDATE mytable 
    SET col1 = expr1
      , col2 = expr2 
      , col3 = expr3

但我们确实需要明确引用我们想要更新的每一列。

我们可以使用SQL语句来获取列名。可能,我们想要排除整数/十进制/浮点列,以及ENUM,SET,DATE,DATETIME,TIMESTAMP等。以下是获取列名称的查询示例:

  SELECT c.column_name
    FROM information_schema.columns
   WHERE c.table_schema = 'mydatabase'
     AND c.table_name   = 'mytable'

注意:反斜杠字符是MySQL文字中的转义字符,

将反斜杠和单引号表示为字符串文字

  '\\'''

将三个反斜杠和一个引号表示为字符串文字

  '\\\\\\'''

如果我想用文字反斜杠和单引号替换单引号的出现,我会使用这样的表达式:

  REPLACE(foo, '''', '\\''') 

当我需要做这样的事情时,为了引用一堆列,我将使用一个查询来帮助生成一些表达式;像这样的东西:

  SELECT CONCAT(',`',c.column_name,'` = REPLACE(`',c.column_name
            ,'`,'''''''',''\\\\'''''')') AS expr
    FROM information_schema.columns c
   WHERE c.table_schema = 'mydatabase'
     AND c.table_name   = 'mytable'
     AND c.data_type IN ('char','varchar')

然后我可以获取为expr返回的值,并在后续语句中使用它。另外请注意增加列中的字符数,这不会超过最大大小。

答案 1 :(得分:0)

你可以使用它。

UPDATE table1, table2, ... 
SET column1 = expression1,
    column2 = expression2,
    ...
WHERE table1.column = table2.column
AND conditions;

如果要更新具有相同数据的两个表,则可能有更好的方法来设计数据库。请记住保持编程干燥

编辑From OA's comments below

DECLARE col_names CURSOR FOR
        SELECT column_name 
          FROM INFORMATION_SCHEMA.COLUMNS
         WHERE table_name = 'tbl_name' 
         ORDER BY ordinal_position;

select FOUND_ROWS() into num_rows; 
SET i = 1; 
the_loop: LOOP 
    IF i > num_rows THEN 
        CLOSE col_names; 
        LEAVE the_loop; 
    END IF; 
    FETCH col_names INTO col_name; //do whatever else you need to do with the col name 
    SET i = i + 1; 
END LOOP the_loop;

答案 2 :(得分:0)

这是错误的方法。数据库中的数据应该是未转义的。也就是说,您应该',而不是\'\\\'。您应用程序应该期望检索'并在必要时为下一步发生的事件添加转义。

如果您使用的是PHP,请使用

  • urlencode()用于创建网址
  • htmlentities()用于转义导致HTML出现问题的4件事:"&<>
  • nl2br()让NL或CR表现得像<br>
INSERTing 撇号到表格时需要

\';见mysqli_real_escape_string()。