[SQL] 데이터베이스 필드에서 특수 문자를 제거
SQL데이터베이스 필드에서 특수 문자를 제거
나는 수천 기록이있는 데이터베이스를 가지고 있고, 나는 그것이 특정 문자 (영숫자, 공백, 작은 따옴표)가 포함되어 있는지 확인 필드 중 하나를 제거해야합니다. 나는 전체 데이터베이스에서 해당 필드에서 (예 등 슬래시, 등) 다른 문자를 제거하려면 어떻게 SQL을 사용할 수 있습니까?
해결법
-
==============================
1.
update mytable set FieldName = REPLACE(FieldName,'/','')
즉 시작하기에 좋은 장소입니다.
-
==============================
2.바꾸기 () 함수는 첫 번째 선택이 될 것입니다. 그러나, 특수 문자는 가끔 콘솔에서 쓸 까다로울 수있다. 그들을 위해 당신은 CHAR () 함수로 교체 결합 할 수 있습니다.
바꾸기 () 함수는 첫 번째 선택이 될 것입니다. 그러나, 특수 문자는 가끔 콘솔에서 쓸 까다로울 수있다. 그들을 위해 당신은 CHAR () 함수로 교체 결합 할 수 있습니다.
예를 들면 € 제거
Update products set description = replace(description, char(128), '');
당신은 여기에 모든 ASCII 값을 찾을 수 있습니다
이상적으로는 모든 특수 문자를 찾기 위해 정규식을 할 수 있지만, 분명히 그것은 MySQL과 수 없습니다.
그건 그렇고, 당신은 당신이 좋아하는 스크립트 언어를 통해 실행해야 할 것입니다.
-
==============================
3.나는 이것에 대한 간단한 함수를 만들었습니다
나는 이것에 대한 간단한 함수를 만들었습니다
DROP FUNCTION IF EXISTS `regex_replace`$$ CREATE FUNCTION `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original VARCHAR(1000)) RETURNS VARCHAR(1000) CHARSET utf8mb4 DETERMINISTIC BEGIN DECLARE temp VARCHAR(1000); DECLARE ch VARCHAR(1); DECLARE i INT; SET i = 1; SET temp = ''; IF original REGEXP pattern THEN loop_label: LOOP IF i>CHAR_LENGTH(original) THEN LEAVE loop_label; END IF; SET ch = SUBSTRING(original,i,1); IF NOT ch REGEXP pattern THEN SET temp = CONCAT(temp,ch); ELSE SET temp = CONCAT(temp,replacement); END IF; SET i=i+1; END LOOP; ELSE SET temp = original; END IF; RETURN temp; END
사용 예 :
SELECT <field-name> AS NormalText, regex_replace('[^A-Za-z0-9 ]', '', <field-name>)AS RegexText FROM <table-name>
-
==============================
4.이것은 또한 유용 할 수 있습니다.
이것은 또한 유용 할 수 있습니다.
먼저 및 / 또는 테이블의 데이터베이스 문자 집합을 알아야합니다. 예를 들어, 우리가 당신을 UTF-8 환경을 가정하자 당신은 다음 빙이나 야후를 통해 인터넷을 검색하거나에 대한 구글 필드에서 원 등록 기호 동그라미 저작권 기호 및 등록 상표의 상징처럼 / 제거 기호를 제거하려면 UTF-8 환경 시스템에서 이러한 기호의 16 진수 코드 값 :
Symbol Utf-8 Hex ======= ========= circled copyright C2A9 circled registered C2AE Trademark (i.e., TM) E284A2
그런 다음이 같은 가능성이 가장 높은 모양은 대체 기능과 함께 육각 / unhex 기능을 사용하여, 테이블 t1에서 필드 F1에 대한 선택 SQL을 것 닦고 :
고르다 cleanf1 AS 캐스트 (unhex (헥스 (F1 (교체 (교체 (교환) CHAR AS 'C2A9' ''), "C2AE '' '),"E284A2' ''))) T1 FROM ;
위가되도록 원래의 필드에게 준거주의 / 말끔히 F1, 테이블 T1이고 출력 헤더 cleanf1이다. / O를 그것 승, 내가 시험되는 MySQL은 5.5.8가 덩어리를 반환, 때문에 "문자로"캐스팅이 필요하다. 도움이 되었기를 바랍니다
-
==============================
5.Vinnies 답변에 정성 들여 ... 당신은 마지막 두 문장에서 탈출 다음 (메모를 사용할 수 있습니다 ...
Vinnies 답변에 정성 들여 ... 당신은 마지막 두 문장에서 탈출 다음 (메모를 사용할 수 있습니다 ...
update table set column = REPLACE(column,"`",""); update table set column = REPLACE(column,"~",""); update table set column = REPLACE(column,"!",""); update table set column = REPLACE(column,"@",""); update table set column = REPLACE(column,"#",""); update table set column = REPLACE(column,"$",""); update table set column = REPLACE(column,"%",""); update table set column = REPLACE(column,"^",""); update table set column = REPLACE(column,"&",""); update table set column = REPLACE(column,"*",""); update table set column = REPLACE(column,"(",""); update table set column = REPLACE(column,")",""); update table set column = REPLACE(column,"-",""); update table set column = REPLACE(column,"_",""); update table set column = REPLACE(column,"=",""); update table set column = REPLACE(column,"+",""); update table set column = REPLACE(column,"{",""); update table set column = REPLACE(column,"}",""); update table set column = REPLACE(column,"[",""); update table set column = REPLACE(column,"]",""); update table set column = REPLACE(column,"|",""); update table set column = REPLACE(column,";",""); update table set column = REPLACE(column,":",""); update table set column = REPLACE(column,"'",""); update table set column = REPLACE(column,"<",""); update table set column = REPLACE(column,",",""); update table set column = REPLACE(column,">",""); update table set column = REPLACE(column,".",""); update table set column = REPLACE(column,"/",""); update table set column = REPLACE(column,"?",""); update table set column = REPLACE(column,"\\",""); update table set column = REPLACE(column,"\"","");
-
==============================
6.이 유용 할 수 있습니다.
이 유용 할 수 있습니다.
이 솔루션은 절차 또는 함수 또는 대체 내 교체의 긴 사용을 만드는 작업이 포함되지 않습니다. 대신 우리는 알 수없는 ASCII 코드 \ x20- \ x7E (16 진수 표현) 내에서 특수 문자 거짓말을 포함 않습니다 모든 ASCII 문자. 출처 위키 백과에서 ASCII, 아래의 백과 사전은 그 간격에서 모든 문자입니다.
Hex: 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E Glyph: space ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ↑ ← @ a b c d e f g h i j k l m n o p q r s t u v w x y z { ACK } ESC
그래서 간단한 정규 표현식으로 일을 할 것입니다 대체
SELECT REGEXP_REPLACE(columnName, '[^\\x20-\\x7E]', '') from tableName;
PHP 사용자 정의 쿼리 문자열
$query = "select REGEXP_REPLACE(columnName, '(.*)[(].*[)](.*)', CONCAT('\\\\1', '\\\\2')) `Alias` FROM table_Name";
위의 문장은 괄호뿐만 아니라 괄호 사이에있는 콘텐츠를 대체합니다. 예를 들면 칼럼은 '직원 Oreintation (CMST TOT)을'들어 있으면 문 위의 브래킷과의 상수, 즉 '직원 Oreintation'를 제거한다.
PS : 당신이 저장 프로 시저 또는 PHP (사용자 지정 쿼리 문자열을 만드는)을 통해 문을 준비 사용하는 DML (선택, 업데이트, ...) 작업을 수행하는 경우; 다음 슬래시를 이스케이프 기억 즉,
SET @sql = CONCAT("SELECT REGEXP_REPLACE(columnName, '[^\\\\x20-\\\\x7E]', '') from tableName"); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
위의 SQL 문은 모든 특수 문자의 간단한 정규 표현식을 대체 (실제로 제거합니다)을 수행; 즉 SQL에서 정규식 패턴은 아무것도로 대체 될 수있는 모든 특수 문자의 언급이다.
패턴의 설명
문자 그룹은 대괄호로 시작됩니다. 첫 번째 문자는 탈자 수단; 모든 문자의 부정 (사각형 괄호로 즉) 그룹에 언급. 이것은 단순히 선택 칭찬 그룹의 모든 문자 (선택 이외의 문자)을 의미한다.
바로 위의 문장의 뜻을 요약합니다
변경되지 않은 : 모든 숫자, 문장 부호 문자, 산술 연산자.
모든 유니 코드 (라틴 알파벳 이외의) 문자 또는 특수 문자를 제거합니다.
-
==============================
7.MySQL 서버에 컴파일 할 필요가 있지만, 그러한 당신의 작업에 도움이 될 것입니다 preg_replace이다 같은 고급 정규 표현식 시설이 LIB_MYSQLUDF_PREG에서보세요.
MySQL 서버에 컴파일 할 필요가 있지만, 그러한 당신의 작업에 도움이 될 것입니다 preg_replace이다 같은 고급 정규 표현식 시설이 LIB_MYSQLUDF_PREG에서보세요.
-
==============================
8.어떤 정규 표현식 교체는 없다. 모든 특수 문자를 교체하려면 다음 코드를 사용하여 '-'.
어떤 정규 표현식 교체는 없다. 모든 특수 문자를 교체하려면 다음 코드를 사용하여 '-'.
UPDATE <table> SET <column> = 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 (<column>, '/', '-'), ',', '-'), '.', '-'), '<', '-'), '>', '-'), '?', '-'), ';', '-'), ':', '-'), '"', '-'), "'", '-'), '|', '-'), '\\', '-'), '=', '-'), '+', '-'), '*', '-'), '&', '-'), '^', '-'), '%', '-'), '$', '-'), '#', '-'), '@', '-'), '!', '-'), '~', '-'), '`', '-'), '', '-'), '{', '-' ), '}', '-' ), '[', '-' ), ']', '-' ), '(', '-' ), ')', '-' )
코드 포맷
UPDATE <table> SET <column> = 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 (<column>, '/', '-'), ',', '-' ), '.', '-' ), '<', '-' ), '>', '-' ), '?', '-' ), ';', '-' ), ':', '-' ), '"', '-' ), "'", '-' ), '|', '-' ), '\\', '-' ), '=', '-' ), '+', '-' ), '*', '-' ), '&', '-' ), '^', '-' ), '%', '-' ), '$', '-' ), '#', '-' ), '@', '-' ), '!', '-' ), '~', '-' ), '`', '-' ), '', '-' ), '{', '-' ), '}', '-' ), '[', '-' ), ']', '-' ), '(', '-' ), ')', '-' )
-
==============================
9.MySQL의 내 버전 REGEXP_REPLACE이없는 (). 나는 다음과 같은 두 가지 해결 방법을 사용 : 1. 제거 지정된 문자 (당신이 제거하고 싶은 문자를 알고있는 경우)
MySQL의 내 버전 REGEXP_REPLACE이없는 (). 나는 다음과 같은 두 가지 해결 방법을 사용 : 1. 제거 지정된 문자 (당신이 제거하고 싶은 문자를 알고있는 경우)
create function fn_remove_selected_characters (v_input_string varchar(255), v_unacceptable_characters varchar(255)) RETURNS varchar(255) BEGIN -- declare variables declare i int; declare unacceptable_values varchar(255); declare this_character char(1); declare output_string varchar(255); declare input_length int; declare boolean_value int; declare space varchar(3); -- Set variable values set input_length = char_length(v_input_string); set i = 0; set unacceptable_values = v_unacceptable_characters; set output_string = ''; set boolean_value = 0; set space = 'no'; begin -- Leave spaces if they aren't in the exclude list if instr( unacceptable_values, ' ') = 0 then begin while i < input_length do SET this_character = SUBSTRING( v_input_string, i, 1 ); -- If the current character is a space, -- then concatenate a space to the output -- Although it seems redundant to explicitly add a space, -- SUBSTRING() equates a space to the empty string if this_character = ' ' then set output_string = concat(output_string, ' '); -- if the current character is not a space, remove it if it's unwanted elseif instr(unacceptable_values, this_character) then set output_string = concat(output_string, ''); -- otherwise include the character else set output_string = concat(output_string, this_character); end if; set i = i + 1; end while; end; else begin while i < input_length do begin SET this_character = SUBSTRING( v_input_string, i, 1 ); if instr(unacceptable_values, this_character) > 0 then set output_string = concat(output_string, ''); else set output_string = concat(output_string, this_character); end if; end; set i = i + 1; end while; end; end if; end; RETURN output_string;
create function fn_preserve_selected_characters (v_input_string varchar(255), v_acceptable_characters varchar(255)) returns varchar(255) begin declare i int; declare acceptable_values varchar(255); declare this_character char(1); declare output_string varchar(255); declare input_length int; declare boolean_value int; declare space varchar(3); set input_length = char_length(v_input_string); set i = 0; set acceptable_values = v_acceptable_characters; set output_string = ''; set boolean_value = 0; set space = 'no'; begin -- check for existence of spaces if instr( acceptable_values, ' ') then begin while i < input_length do -- SUBSTRING() treats spaces as empty strings -- so handle them specially SET this_character = SUBSTRING( v_input_string, i, 1 ); if this_character = ' ' then set output_string = concat(output_string, ' '); elseif instr(acceptable_values, this_character) then set output_string = concat(output_string, this_character); else set output_string = concat(output_string, ''); end if; set i = i + 1; end while; end; -- if there are no spaces in input string -- then this section is complete else begin while i <= input_length do SET this_character = SUBSTRING( v_input_string, i, 1 ); -- if the current character exists in the punctuation string if LOCATE( this_character, acceptable_values ) > 0 THEN set output_string = concat(output_string, this_character); end if; set i = i+1; end while; end; end if; end; RETURN output_string;
-
==============================
10.Adeel의 대답은 지금까지 최고의 간단합니다.
Adeel의 대답은 지금까지 최고의 간단합니다.
영업 이익 내가 너무 필요하다 DB를 업데이트 할 필요가 있었다. 그래서 나는 나처럼, 다음 가난한 유일한 여기 그것을 넣어 것,하지 내가 무슨 짓을 다시 실행해야 할 생각.
더블 체크 첫째을 선택하고 업데이트하기 전에 당신이 올바른 행을 받고있어 할을 검사합니다.
SELECT REGEXP_REPLACE(columnName, '[^\\x20-\\x7E]', '') from tableName;
안전 점검을 수행하는 카운트 ...
SELECT count(*) from tableName WHERE columnName REGEXP '[^\\x20-\\x7E]';
어떤 이름의 I는 O가 무덤 또는 회선 또는 움라우트을 가지고 있기 때문에 Ramn에 라몬 같은 그 의미를 상실하지 않도록 다른 매핑을해야했다. 나는 이것이 매핑하는 데 사용 그래서 ... https://theasciicode.com.ar
그런 다음이 업데이트는 모든 매핑 업데이트 후 캐치입니다 업데이트합니다. 위의 카운트 값으로 제한 번호를 변경 ...
UPDATE tablename SET columnName = REGEXP_REPLACE(columnName, '[^\\x20-\\x7E]', '') WHERE columnName REGEXP '[^\\x20-\\x7E]' LIMIT 1;
from https://stackoverflow.com/questions/6066953/remove-special-characters-from-a-database-field by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 테이블의 모든 열을 검색 할 수 있습니다? (0) | 2020.07.05 |
---|---|
[SQL] 이유는 명시 적으로 SQL에서 "GROUP BY"절을 모든 열을 지정해야합니까 - 왜 안 "GROUP BY *"? (0) | 2020.07.05 |
[SQL] CSV 또는 Excel로 SQL 쿼리 결과 내보내기 (0) | 2020.07.05 |
[SQL] CursorWindow를 할당 할 수 없습니다 (0) | 2020.07.05 |
[SQL] 윈도우 함수의 FILTER 절에서 현재 행을 참조하기 (0) | 2020.07.05 |