Вопрос по replace, mysql – mysql: replace \ (обратная косая черта) в строках

9

У меня возникла следующая проблема:

У меня есть таблица 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

Какие-либо предложения?

Спасибо заранее.

Вы рассматривали возможность использования другого разделителя? Если проблема заключается в архаичных данных, достаточно простого сценария, который обновляет старые данные. teh1
Может быть, я не очень хорошо это объяснил. Оказывается, если я использую quote () для имени, я получаю то, что хочу, то есть \ воспринимается буквально. user1316758
Не уверен, что я следую. Ожидаете ли вы, что найденное значение будет найдено без указания того же способа, которым оно было вставлено? jefflunt

Ваш Ответ

6   ответов
-3

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

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

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

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
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 как максимальное вхождение символа char, учитывая, что размер поля равен 10, как указано в запросе на создание таблицы.

Мы все еще можем обобщить это. Если это все еще не оправдало ваших ожиданий, не стесняйтесь просить моей помощи.

0

Вы могли бы использоватьLIKE:

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

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

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

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

1

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

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

вывод (см.это работает на 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';
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
3

Вы должны использовать & quot;verbatim string& quot; .После использования этой строки ваша функция замены будет выглядеть так

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

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

Похожие вопросы