2014-01-19 3 views
0

Есть ли регистр нечувствительный Replace для MySQL?Нечувствительный к регистру REPLACE для MySQL

Я пытаюсь заменить прежнее имя пользователя пользователя своим новым в тексте абзаца.

$targetuserold = "@".$mynewusername; 
$targetusernew = "@".$newusername; 

$sql = " 
    UPDATE timeline 
    SET message = Replace(message,'".$targetuserold."', '".$targetusernew."') 
"; 

$result = mysql_query($sql); 

Отсутствуют случаи, когда старое имя пользователя - это другой случай. Пример: при замене «Хэнк» на «Джек» во всех строках моей базы данных останутся экземпляры «ханк».

ответ

0

Мое решение в конечном счете, было то, что я не могу сделать регистронезависимы Replace.

Однако Я нашел обходное решение.

Я пытался использовать функцию, где пользователь может изменить свое имя пользователя. Затем система должна будет обновляться везде, где @oldusername был найден во всех сообщениях в базе данных.

Проблема была ... люди не будут вводить имена других людей в правильном случае, если они находятся в таблице members. Поэтому, когда пользователь изменит свое имя пользователя, он не поймает эти экземпляры @oldSeRNAmE, потому что он не соответствует случаю реального формата oldusername.

У меня нет разрешения с моим общим сервером GoDaddy, чтобы сделать это с помощью настраиваемой функции SQL, поэтому мне пришлось искать другой способ.

Мое решение: После добавления новых сообщений в базу данных, всякий раз, когда имя пользователя находится в новом сообщении, у меня есть UPDATE заявление в тот момент, чтобы заменить имя они набранный с правильным отформатированный случае, который находится в Таблица members. Таким образом, если этот человек когда-либо захочет изменить свое имя пользователя в будущем, все экземпляры этого имени пользователя в базе данных будут иметь одинаковый точный форматированный случай. Задача решена.

1

Здесь:

DELIMITER $$ 

DROP FUNCTION IF EXISTS `replace_ci`$$ 
CREATE FUNCTION `replace_ci` (str TEXT,needle CHAR(255),str_rep CHAR(255)) 
    RETURNS TEXT 
    DETERMINISTIC 
    BEGIN 
     DECLARE return_str TEXT DEFAULT ''; 
     DECLARE lower_str TEXT; 
     DECLARE lower_needle TEXT; 
     DECLARE pos INT DEFAULT 1; 
     DECLARE old_pos INT DEFAULT 1; 

     SELECT lower(str) INTO lower_str; 
     SELECT lower(needle) INTO lower_needle; 
     SELECT locate(lower_needle, lower_str, pos) INTO pos; 
     WHILE pos > 0 DO 
      SELECT concat(return_str, substr(str, old_pos, pos-old_pos), str_rep) INTO return_str; 
      SELECT pos + char_length(needle) INTO pos; 
      SELECT pos INTO old_pos; 
      SELECT locate(lower_needle, lower_str, pos) INTO pos; 
     END WHILE; 
     SELECT concat(return_str, substr(str, old_pos, char_length(str))) INTO return_str; 
     RETURN return_str; 
END$$ 

DELIMITER ; 

Использование:

$sql = " 
    UPDATE timeline 
    SET message = replace_ci(message,'".$targetuserold."', '".$targetusernew."') 
"; 
+0

Я не знаком с синтаксисом описания этой функции. Как бы реализовать это в моем PHP-скрипте? Это в PHP? – Tom

+0

@tomuky Нет, это SQL-запрос, который ваш сервер mySql должен запускать в вашей базе данных. Вам просто нужно убедиться, что вы сначала запускаете скрипт 'CREATE FUNCTION replace_ci', прежде чем запускать какой-либо скрипт против этой функции. –

+0

Я не знаю, как заставить мой MySQL-сервер выполнять этот SQL-запрос в моей базе данных. Это можно сделать в PHP? Любой полезный материал для чтения для меня, чтобы сделать это, будет оценен по достоинству. – Tom

0

Простой способ, который работает без какой-либо сохраненной функции:

SELECT message, 
     substring(comments,position(lower('".$targetuserold."') in message)) AS oldval 
    FROM timeline 
WHERE message LIKE '%".$targetuserold."%' 

дает точное, чувствительное к регистру написания имени пользователя во всех сообщениях. Как вы, кажется, запускаете это из скрипта PHP, вы можете использовать это для сбора написания вместе с соответствующими идентификаторами, а затем запустить простой REPLACE(message,'".$oldval.",'".$targetusernew."'). Или используйте приведенное выше как подвыбор:

UPDATE timeline 
    SET message = REPLACE(
        message, 
        (SELECT substring(comments,position(lower('".$targetuserold."') in message))), 
        '".$targetusernew."' 
       ) 

Работает как очарование здесь.

Кредиты предоставлены this article, откуда я получил эту идею.

Смежные вопросы