Oracle удалить из строки все кроме цифр
в настоящее время мы переносим одну из наших баз данных oracle в UTF8, и мы нашли несколько записей, которые близки к пределу 4000 байт varchar. Когда мы пытаемся перенести эти записи, они терпят неудачу, поскольку они содержат символы, которые становятся многобайтовыми символами UF8. Что я хочу сделать в PL / SQL, это найти эти символы, чтобы увидеть, что они такое, а затем либо изменить их, либо удалить.
Я хотел бы сделать :
но Oracle не реализует [: ascii:] класс символов.
есть ли простой способ сделать то, что я хочу сделать?
в однобайтовой кодировке, совместимой с ASCII (например, Latin-1), символы ASCII-это просто байты в диапазоне от 0 до 127. Так что вы можете использовать что-то вроде [\x80-\xFF] для обнаружения символов, отличных от ASCII.
если вы используете ASCIISTR функция для преобразования Юникода в литералы формы \nnnn , тогда вы можете использовать REGEXP_REPLACE чтобы удалить эти литералы, вот так.
. где field и table-ваши имена полей и таблиц соответственно.
Я думаю, что это будет делать трюк:
Я бы не рекомендовал его для производственного кода, но это имеет смысл и, кажется, работает:
вероятно, есть более прямой способ использования регулярных выражений. Если повезет, кто-нибудь другой обеспечит его. Но вот что я бы сделал без необходимости обращаться к руководствам.
создайте функцию PLSQL для получения входной строки и возврата varchar2.
в функции PLSQL выполните asciistr () вашего ввода. PLSQL потому, что это может вернуть строку длиннее 4000, и у вас есть 32K, доступный для varchar2 в PLSQL.
эта функция преобразует символы, отличные от ASCII, для обозначения \xxxx. Так что вы можете использовать регулярные выражения, чтобы найти и удалить их. Затем верните результат.
выбор может выглядеть следующим образом:
У меня была аналогичная проблема, и я написал об этом в блоге здесь. Я начал с регулярного выражения для Альфа-цифр, затем добавил несколько основных знаков препинания, которые мне понравились:
я использовал дамп с вариантом 1016, чтобы выдать шестнадцатеричные символы, которые я хотел заменить, которые я мог бы использовать в utl_raw.cast_to_varchar2.
Я нашел ответ здесь:
затем запустите это, чтобы обновить данные
ответ, данный Франсиско Hayoz является лучшим. Не используйте функции pl/sql, если sql может сделать это за вас.
вот простой тест в Oracle 11.2.03
и "rep 127-255" - это
Тип=1 Лен=30: 226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
i.e по какой-то причине эта версия Oracle не заменяет char(226) и выше. С помощью '['|/chr(127)||'-'||chr (225)//'] ' дает желаемый результат. Если вам нужно заменить другие символы, просто добавьте их в регулярное выражение выше или используйте вложенную replace|regexp_replace, если замена отличается " (нулевая строка).
Спасибо, это работает для моих целей. Кстати, в приведенном выше примере отсутствует одинарная кавычка.
REGEXP_REPLACE (СТОЛБЕЦ, ' [^'|/CHR (32) || '-' || CHR (127) || ']', ' '))
Я использовал его в функции переноса слов. Иногда во входящем тексте была встроенная новая строка/ NL / CHR(10) / 0A, которая все испортила.
обратите внимание, что всякий раз, когда вы используете
механизм регулярных выражений Oracle будет соответствовать определенным символам из диапазона Latin-1: это относится ко всем символам, которые похожи на символы ASCII, такие как Ä->A, Ö->O, Ü->U и т. д., так что [A-Z] - это не то, что вы знаете из других сред, таких как, скажем, Perl.
вместо того, чтобы возиться с регулярными выражениями, попробуйте изменить тип данных NVARCHAR2 до обновления набора символов.
другой подход: вместо того, чтобы вырезать часть содержимого полей, вы можете попробовать функцию SOUNDEX, при условии, что ваша база данных содержит только европейские символы (т. е. латинские-1). Или вы просто пишете функцию, которая переводит символы из диапазона Latin-1 в похожие символы ASCII, такие как
конечно только для текстовых блоков, превышающих 4000 байт при преобразовании в UTF-8.
вы можете попробовать что-то вроде следующего для поиска столбца, содержащего символ, отличный от ascii :
Регулярные выражения произошли из теорий автоматов и формальных языков, поэтому поначалу производят устрашающее впечатление. Однако, их базовые понятия являются простыми и в то же время мощными.
Начиная с версии Oracle 10g регулярные выражения можно использовать напрямую в SQL запросах.
Шаблон регулярных выражений выражается в виде строки, содержащей следующие конструкции:
- Литеральные символы. Фактические символы, которые следует искать (Например, шаблон xyz соответствует только вхождению «xyz»)
- Метасимволы. Операции, определяющие алгоритмы, которые должны применяться во время поиска (Например, шаблон ^xyz соответсвует только строке, начинающейся с «xyz» — другие вхождения не учитываются)
Оператор REGEXP_LIKE
REGEXP_LIKE(исходная_строка, шаблон[, параметр_сопоставления])
исходная_строка | поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG) |
шаблон | это другое название регулярного выражения |
параметр_сопоставления | позволяет использовать дополнительные параметры, такие как символ перехода на новую строку, многострочное форматирование и обеспечение управления учетом регистра |
Используется подобно оператору like в части where или же при определении ограничения на таблицу (constraint) .
Пример использования регулярных выражений:
Функция REGEXP_INSTR
REGEXP_INSTR(исходная_строка, шаблон[, начальная_позиция [, вхождение [, опция_возврата [, параметр_сопоставления ] ] ] ] )
исходная_строка | поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG) |
шаблон | регулярное выражение |
начальная_позиция | позиция, с которой должен начинаться поиск |
вхождение | по умолчанию имеет значение 1, если пользователь не укажет поиск последовательных вхождений |
опция_возврата | значение по умолчанию 0, тогда возвратится начальная позиция шаблона; при значении 1 возвращается позиция символа, следующего за шаблоном |
параметр_сопоставления | позволяет использовать дополнительные параметры, такие как символ перехода на новую строку, многострочное форматирование и обеспечение управления учетом регистра |
Функция возвращает позицию символа, находящегосяв начале или конце соответствия для шаблона, так же как и ее аналог instr.
В отличие от instr, функция regexp_instr работает с начала строки и двигается вперед в поисках шаблона. Она не может начать с конца строки и перемещаться в обратном направлении.
Функция REGEXP_SUBSTR
REGEXP_SUBSTR(исходная_строка, шаблон[, позиция [, вхождение [,параметр_сопоставления]]])
исходная_строка | поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG) |
шаблон | регулярное выражение |
позиция | позиция, с которой необходимо начинать поиск |
вхождение | по умолчанию имеет значение 1 |
параметр_сопоставления | позволяет использовать дополнительные параметры, такие как символ перехода на новую строку, многострочное форматирование и обеспечение управления учетом регистра |
Функция REGEXP_SUBSTR возвращает подстроку, которая соответствует шаблону.
Пример использования регулярных выражений:
Функция REGEXP_REPLACE
REGEXP_REPLACE(исходная_строка, шаблон [, строка_замены [, позиция[,вхождение, [параметр_сопоставления]]]])
исходная_строка | поддерживает символьные типы данных (CHAR, VARCHAR2, CLOB, NCHAR, NVARCHAR2 и NCLOB, но не LONG) |
шаблон | регулярное выражение |
шаблон замены | текст для замены каждого вхождения |
позиция | позиция, с которой необходимо начинать поиск |
вхождение | по умолчанию имеет значение 1 |
параметр_сопоставления | позволяет использовать дополнительные параметры, такие как символ перехода на новую строку, многострочное форматирование и обеспечение управления учетом регистра |
REGEXP_REPLACE возвращает измененную входную строку, в которой все вхождения шаблона заменены значением, переданным в параметре строка_замены.
Пример использования регулярных выражений:
Регулярные выражения Oracle
Таблица 1: Метасимволы привязки
Метасимвол | Описание | Пример |
^ | Привязать выражение к началу строки | «^привет» соответствует «привет, как дела», но не «как дела, привет» |
$ | Привязать выражение к концу строки | «привет$» соответсвует «как дела, привет», но не «привет, как дела» |
Таблица 2: Квантификаторы и операторы повтора
Квантификатор | Описание | Пример |
* | Встречается 0 и более раз | REGEXP_REPLACE(str, ’11*’, ‘1’) Результат: test11 => test1 11123345 => 123345 |
? | Встречается 0 или 1 раз | |
+ | Встречается 1 и более раз | REGEXP_LIKE(str,’5+’) Результат: test11 => false 11123345 => true |
Встречается ровно m раз | REGEXP_LIKE(str,’3’) Результат: test11 => false 11123345 => true | |
Встречается по крайней мере m раз | ||
Встречается по крайней мере m раз, но не более n раз |
Таблица 3: Предопределенные символьные классы POSIX
Класс символов | Описание |
. | Любой символ |
[:alpha:] | Буквы |
[:lower:] | Буквы в нижнем регистре |
[:upper:] | Буквы в верхнем регистре |
[:digit:] | Цифры |
[:alnum:] | Буквы и цифры |
[:space:] | Пробелы (не печатаемые символы), такие как перевод каретки, новая строка, вертикальная табуляция и подача страницы |
[:punct:] | Знаки препинания |
[:cntrl:] | Управляющие символы (не печатаемые) |
[:print:] | Печатаемые символы |
Таблица 4: Альтернативное сопоставление и группировка выражений
Метасимвол | Описание | |
| | Альтернатива | Разделяет альтернативные варианты, часто используется с оператором группировки () |
( ) | Группа | Группирует подвыражения для альтернативы, квантификатора или ссылочности |
[char] | Список символов | Обозначает список символов; большинство метасимволов в списке символов представляют собой литеры, за исключением символьных классов и метасимволов ^ и — |
[^char] | Список символов | Список символов, которые не должны присутствовать в строке |
Таблица 5: Метасимвол ссылки
За ней следует цифра от 1 до 9, обратная косая черта связана с предыдущим сопоставлением с соответствующим номером заключенного в скобки подвыражения.
Более полную информацию можно прочитать здесь Using Regular Expressions in Oracle Database
Функция Oracle/PLSQL REGEXP_REPLACE является расширением функции REPLACE. Эта функция, введенная в Oracle 10g, позволит вам заменить последовательность символов в строке другим набором символов, используя сопоставление шаблонов регулярных выражений.
Синтаксис
Синтаксис функции Oracle/PLSQL REGEXP_REPLACE :
REGEXP_REPLACE( string, pattern [, replacement_string [, start_position [, nth_appearance [, match_parameter ] ] ] ] )
Параметры или аргументы
string
Строка для поиска. Это могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.
pattern
Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
^ | Соответствует началу строки. При использовании match_parameter с m , соответствует началу строки в любом месте в пределах выражения. |
$ | Соответствует концу строки. При использовании match_parameter с m , соответствует концу строки в любом месте в пределах выражения. |
* | Соответствует нолю или более вхождений. |
+ | Соответствует одному или более вхождений. |
? | Соответствует нолю или одному вхождению. |
. | Соответствует любому символу, кроме NULL. |
| | Используется как "OR", чтобы указать более одной альтернативы. |
[ ] | Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке. |
[^ ] | Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке. |
( ) | Используется для групповых выражений в качестве подвыражений. |
Соответствует m раз. | |
Соответствие как минимум m раз. | |
Соответствие как минимум m раз, но не более n раз. | |
\n | n представляет собой число от 1 до 9. Соответствует n -му подвыражению находящемуся в ( ) перед \n. |
[..] | Соответствует одному сопоставлению элемента, который может быть более одного символа. |
[::] | Соответствует классу символов. |
[==] | Соответствует классу эквивалентности |
\d | Соответствует цифровому символу. |
\D | Соответствует не цифровому символу. |
\w | Соответствует текстовому символу. |
\W | Соответствует не текстовому символу. |
\s | Соответствует символу пробел. |
\S | Соответствует не символу пробел. |
\A | Соответствует началу строки или соответствует концу строки перед символом новой строки. |
\Z | Соответствует концу строки. |
*? | Соответствует предыдущему шаблону ноль или более вхождений. |
+? | Соответствует предыдущему шаблону один или более вхождений. |
?? | Соответствует предыдущему шаблону ноль или одному вхождению. |
? | Соответствует предыдущему шаблону n раз. |
? | Соответствует предыдущему шаблону, по меньшей мере n раз. |
? | Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз. |
replacement_string
Необязательный. Соответствующие шаблоны в строке будут заменены на replace_string . Если параметр replacement_string опущен, то функция просто удаляет все совпадающие шаблоны и возвращает полученную строку.
start_position
Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.
nth_appearance
Необязательный. Это n -й вид шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке. Если вы укажете 0 для этого параметра, все вхождения шаблона в строке будут заменены.
match_parameter
Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_REPLACE. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
'c' | Выполняет чувствительное к регистру согласование. |
'i' | Выполняет не чувствительное к регистру согласование. |
'n' | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
'm' | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
'x' | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
Функция REGEXP_REPLACE возвращает строковое значение.
Примечание
- Если для параметра match_parameter имеются противоречивые значения, функция REGEXP_REPLACE будет использовать последнее значение.
- См. также функцию REPLACE.
Применение
Функция REGEXP_REPLACE может использоваться в следующих версиях Oracle/PLSQL:
Пример совпадения с первым словом
Рассмотрим пример использования функции REGEXP_REPLACE для замены первого слова в строке.
Функция Oracle/PLSQL REGEXP_SUBSTR является расширением функции SUBSTR. Эта функция, представленная в Oracle 10g, позволит вам извлечь подстроку из строки, используя сопоставление шаблонов регулярных выражений.
Синтаксис
Синтаксис функции Oracle/PLSQL REGEXP_SUBSTR :
REGEXP_SUBSTR( string, pattern [, start_position [, nth_appearance [, match_parameter [, sub_expression ] ] ] ] )
Параметры или аргументы
string
Строка для поиска. Это могут быть CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.
pattern
Шаблон. Регулярное выражение для сопоставления. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
^ | Соответствует началу строки. При использовании match_parameter с m , соответствует началу строки в любом месте в пределах выражения. |
$ | Соответствует концу строки. При использовании match_parameter с m , соответствует концу строки в любом месте в пределах выражения. |
* | Соответствует нолю или более вхождений. |
+ | Соответствует одному или более вхождений. |
? | Соответствует нолю или одному вхождению. |
. | Соответствует любому символу, кроме NULL. |
| | Используется как "OR", чтобы указать более одной альтернативы. |
[ ] | Используется для указания списка совпадений, где вы пытаетесь соответствовать любому из символов в списке. |
[^ ] | Используется для указания списка nonmatching, где вы пытаетесь соответствовать любому символу, за исключением тех кто в списке. |
( ) | Используется для групповых выражений в качестве подвыражений. |
Соответствует m раз. | |
Соответствие как минимум m раз. | |
Соответствие как минимум m раз, но не более n раз. | |
\n | n представляет собой число от 1 до 9. Соответствует n -му подвыражению находящемуся в ( ) перед \n. |
[..] | Соответствует одному сопоставлению элемента, который может быть более одного символа. |
[::] | Соответствует классу символов. |
[==] | Соответствует классу эквивалентности |
\d | Соответствует цифровому символу. |
\D | Соответствует не цифровому символу. |
\w | Соответствует текстовому символу. |
\W | Соответствует не текстовому символу. |
\s | Соответствует символу пробел. |
\S | Соответствует не символу пробел. |
\A | Соответствует началу строки или соответствует концу строки перед символом новой строки. |
\Z | Соответствует концу строки. |
*? | Соответствует предыдущему шаблону ноль или более вхождений. |
+? | Соответствует предыдущему шаблону один или более вхождений. |
?? | Соответствует предыдущему шаблону ноль или одному вхождению. |
? | Соответствует предыдущему шаблону n раз. |
? | Соответствует предыдущему шаблону, по меньшей мере n раз. |
? | Соответствует предыдущему шаблону, по меньшей мере n раз, но не более m раз. |
start_position
Необязательный. Это позиция в строке, откуда начнется поиск. Если этот параметр опущен, по умолчанию он равен 1, который является первой позицией в строке.
nth_appearance
Необязательный. Это n -й вид шаблона в строке. Если этот параметр опущен, по умолчанию он равен 1, который является первым вхождением шаблона в строке. Если вы укажете 0 для этого параметра, все вхождения шаблона в строке будут заменены.
match_parameter
Необязательный. Это позволяет изменять поведение соответствия для условия REGEXP_REPLACE. Это может быть комбинацией следующих значений:
Значение | Описание |
---|---|
'c' | Выполняет чувствительное к регистру согласование. |
'i' | Выполняет не чувствительное к регистру согласование. |
'n' | Позволяет период символа (.) для соответствия символа новой строки. По умолчанию, период метасимволы. |
'm' | Выражение допускает, что есть несколько строк, где ^ это начало строки, а $ это конец строки, независимо от позиции этих символов в выражении. По умолчанию предполагается, что выражение в одной строке. |
'x' | Игнорируются символы пробелов. По умолчанию, символы пробелов совпадают, как и любой другой символ. |
subexpression
Необязательный. Используется, когда шаблон имеет подвыражения, и вы хотите указать, какое подвыражение в шаблоне является целью. Это целочисленное значение от 0 до 9, указывающее, что подвыражение соответствует шаблону.
- Функция REGEXP_SUBSTR возвращает строковое значение.
- Если функция REGEXP_SUBSTR не обнаруживает какого-либо вхождения шаблона, она возвращает NULL.
Примечание
- Если для параметра match_parameter имеются конфликтующие значения, функция REGEXP_SUBSTR будет использовать последнее значение.
- См. Также функцию SUBSTR.
Применение
Функция REGEXP_SUBSTR может использоваться в следующих версиях Oracle / PLSQL:
Я работаю над процедурой сравнения строк, но для большей эффективности мне нужно удалить все символы, не являющиеся буквами или цифрами.
REPLACE Сейчас я использую несколько функций, но, может быть, есть более быстрое и приятное решение?
Бьюсь об заклад, что обычное сравнение более эффективно, чем первая строковая манипуляция, а затем сравнение.
Это, безусловно, лучший ответ здесь. Кроме того, его легко расширять. Я просто использовал [:digit:] вместо [:alnum:] . Спасибо!
Для людей, интересующихся, почему это не работает в Mariadb: я удалил строки DELIMITER, изменил последнюю строку на «END //» и изменил регулярное выражение на «Mar [[: alnum:]]», чтобы все заработало.
Это будет принимать только строки длиной до 32 символов и вернет только строки длиной до 16 символов. Его можно легко изменить для работы со строками длиной до 255 символов, изменив первые 32 и 16 на 255.
С точки зрения производительности (и при условии, что вы читаете больше, чем пишете)
Я думаю, что лучшим способом было бы предварительно вычислить и сохранить версию столбца с разделением. Таким образом, вы меньше выполняете преобразование.
Затем вы можете поместить индекс в новый столбец, и база данных сделает всю работу за вас.
. нет? Вы не можете получить простую строку из совпадения регулярного выражения, потому что сам mysql поддерживает только совпадение, а не замену .
Вы уверены . Ниже приведен ответ, который ясно показывает, как написать функцию для обработки столбца, и правильно предполагает, что есть загружаемая библиотека регулярных выражений (вероятно, lib_mysqludf_preg), которую вы можете использовать!
Регулярные выражения MySQL могут только находить данные. они не могут делать замену, так что это совершенно не поможет OP.
OP сказал: I'm working on a routine that compares strings вот что это делает, если OP хочет манипулировать строкой, тогда REGEXP не будет работать.
Да, но ему нужно убрать символы, отличные от alnum, из строки «для эффективности», и он хочет знать, есть ли что-то более быстрое, чем повторяющиеся вызовы replace ().
я согласен с @Marc. OP хочет эффективно сравнивать строки, игнорируя нечисловые и буквенные символы . не уверен, что это более эффективно, чем просто полное сравнение .
Начиная с MySQL 8.0 вы можете использовать регулярное выражение для удаления не буквенно-цифровых символов из строки. Есть метод REGEXP_REPLACE
Вот код для удаления не буквенно-цифровых символов:
Для MySQL
Прямое и проверенное решение для латинских и кириллических символов:
Из всех опубликованных замечательных решений это было наиболее надежным и гибким для моих нужд. Я просто изменил список символов для своих целей и, в отличие от регулярного выражения, могу быть уверен, что это не будет двусмысленный набор символов.
Намного быстрее, чем самый популярный ответ. Его также легко изменить (мне нужно было сохранить пробелы между словами.)
Самый быстрый способ найти (и использовать) - это convert ().
из док. CONVERT () с USING используется для преобразования данных между различными наборами символов.
В вашем случае правильный набор символов будет самоопределен
ПРИМЕЧАНИЕ от Док. ИСПОЛЬЗОВАНИИ форма CONVERT() доступна как в 4.1.0 .
Прекрасный трюк с использованием преобразования ascii. Как раз то, что мне нужно для удаления символов UTF
На основе ответа Райана Шиллингтона , измененного для работы со строками длиной более 255 символов и с сохранением пробелов из исходной строки.
К вашему сведению, lower(str) в конце концов.
Я использовал это для сравнения строк:
Будьте осторожны с REGEXP '[[: alnum:]]'. Я заметил, что REGEXP '[[: alnum:]]' распознает некоторые символы как буквы или цифры, даже если они таковыми не являются (например, char: '-' и не путать с '-')
Будьте осторожны, такие символы, как «или», рассматриваются MySQL как альфа. Лучше использовать что-то вроде:
IF c BETWEEN 'a' AND 'z' OR c BETWEEN 'A' AND 'Z' OR c BETWEEN '0' AND '9' OR c = '-' THEN
Я написал этот UDF. Однако он обрезает только специальные символы в начале строки. Он также преобразует строку в нижний регистр. При желании вы можете обновить эту функцию.
Кроме того, вы можете использовать регулярные выражения, но для этого потребуется установить расширение MySql.
Это можно сделать с помощью функции замены регулярных выражений, которую я опубликовал в другом ответе и писал здесь в блоге . Это может быть не самое эффективное решение и может показаться излишним для выполняемой работы, но, как швейцарский армейский нож, оно может пригодиться по другим причинам.
Это можно увидеть в действии, удалив все не буквенно-цифровые символы в этой онлайн-демонстрации Rextester .
SQL (исключая для краткости код функции) :
У меня была аналогичная проблема с попыткой сопоставить фамилии в нашей базе данных, которые немного отличались. Например, иногда люди вводили одно и то же имя как «Макдональдс», а также как «Макдональдс» или «Сент-Джон» и «Сент-Джон».
Вместо того, чтобы пытаться преобразовать данные Mysql, я решил проблему, создав функцию (в PHP), которая будет принимать строку и создавать регулярное выражение только для альфа-канала:
Теперь я могу искать в базе данных с таким запросом:
This is only advisable on a known set of data, otherwise it's trivial for some special characters to slip past with a blacklist approach instead of a whitelist approach.
Очевидно, что самый простой способ - это предварительно проверить данные вне sql из-за отсутствия надежных встроенных белых списков (например, с помощью замены регулярного выражения).
Читайте также: