2012-04-08 3 views
8

Я имеющих следующую проблему:MySQL: заменить (обратная косая черта) в строках

У меня есть таблица T, которая имеет столбец Name с именами. Имена имеют следующую структуру:

А \\ В \ С

Вы можете создать на себя, как это:

create table T (Name varchar(10)); 

insert into T values ('A\\\\B\\C'); 

select * from T; 

Теперь, если я делаю это:

select Name from T where Name = 'A\\B\C'; 

Это не работает, мне нужно избежать \ (обратная косая черта):

select Name from T where Name = 'A\\\\B\\C'; 

Изобразительное.

Но как это сделать автоматически для имени строки?

что-то вроде следующего не будет делать это:

select replace('A\\B\C', '\\', '\\\\'); 

я получаю: A\\\BC

Любые предложения?

Большое спасибо заранее.

+1

Не уверен, что я следую. Вы ожидаете, что вставленное значение будет найдено без указания его так же, как оно было вставлено? – jefflunt

+0

Рассматривали ли вы использование другого разделителя? Если проблема связана с архаичными данными, достаточно простого сценария, который обновляет старые данные. – teh1

+0

Возможно, я не очень хорошо объяснил это. Оказывается, если я использую quote() для имени, я получаю то, что хочу, т. Е. \ Берется буквально. – user1316758

ответ

1

Буквальная A\\B\C должны быть закодированы как A\\\\A\\C, а параметры replace() необходимости избежать слишком:

select 'A\\\\B\\C', replace('A\\\\B\\C', '\\', '\\\\'); 

выход (см this running on SQLFiddle):

A\\B\C   A\\\\B\\C 


Таким образом, существует мало смысла используя замену. Эти два утверждения эквивалентны:

select Name from T where Name = replace('A\\\\B\\C', '\\', '\\\\'); 
select Name from T where Name =   'A\\\\B\\C'; 
+0

выберите replace ('A \\ B \ C', '\', '\\'); возвращает ошибку, так как обратная косая черта избегает апострофа в параметре поиска. – Jestep

+0

@Jestep Спасибо, что выбрали это. Я исправил ошибку. Cheers – Bohemian

-3

Не совсем уверен, что вы имеете в виду, но это должно сработать.

select replace('A\\B\C', '\', '\\'); 

Это в основном собирается заменить \ везде, где встречается с \\ :)

Это то, что вы хотели?

+0

Нет, это не так, вы избегаете неправильного пути. – arnoudhgz

+0

Это даже не «компилируется», у вас есть синтаксическая ошибка, выходящая за второй параметр. –

0

Вы можете использовать LIKE:

SELECT NAME FROM T WHERE NAME LIKE '%\\\\%'; 
1

Использование регулярных выражений позволит решить вашу проблему.

Этот ниже запрос разрешит данный пример.

1) S\\D\B 

select * from T where Name REGEXP '[A-Z]\\\\\\\\[A-Z]\\\\[A-Z]$'; 

если упаковывают данный пример может иметь более одного обугленного

2) D\\B\ACCC 

select * from T where Name REGEXP '[A-Z]{1,5}\\\\\\\\[A-Z]{1,5}\\\\[A-Z]{1,5}$'; 

примечания: я использовал 5 в качестве максимального появления знака с учетом размера поля является 10, как сво упоминается в создании таблицы запрос.

Мы все еще можем обобщить его. Если это еще не оправдалось, вы можете попросить мою помощь.

1

Вы вводите в заблуждение, что в базе данных, как вы представляете эти данные в операторах SQL. Когда строка в базе данных содержит специальный символ, такой как \, вы должны ввести \\ для представления этого символа, потому что \ является специальным символом в синтаксисе SQL. Вы должны сделать это в операциях INSERT, но вы также должны сделать это в параметрах функции REPLACE. В данных никогда нет двойных косых черт, они всего лишь часть пользовательского интерфейса.

Почему, по-вашему, вам нужно удвоить косые черты в выражении SQL? Если вы вводите запросы, вы должны просто удвоить косые черты в командной строке. Если вы генерируете запрос на языке программирования, лучшим решением является использование подготовленных операторов; API позаботится о правильном кодировании (подготовленные операторы обычно используют двоичный интерфейс, который обрабатывает необработанные данные). Если по какой-то причине вам нужно выполнить запросы, построив строки, язык, надеюсь, предоставит функцию для выхода из строки. Например, в PHP вы должны использовать mysqli_real_escape_string.

Но вы не можете сделать это самим SQL - если вы попытаетесь передать неэкспертированную строку в SQL, данные будут потеряны и не смогут ее восстановить.

2

Вы должны использовать «дословный строку» .После с помощью этой строки вашего Replace функции выглядеть следующим образом

Replace(@"\", @"\\") 

Я надеюсь, что это поможет вам.