Не совсем то, что вы спрашиваете, но в моей грамматике MySQL я должен поддерживать несколько версий сервера, что я делаю, используя семантические предикаты. Это означает, что я могу использовать одну грамматику и включать / отключать определенные пути в зависимости от поля serverVersion
, которое есть в моем парсере. Вот как это выглядит:
alterDatabase:
DATABASE_SYMBOL schemaRef (
createDatabaseOption+
| {serverVersion < 80000}? UPGRADE_SYMBOL DATA_SYMBOL DIRECTORY_SYMBOL NAME_SYMBOL
)
;
и работает очень хорошо. Я могу использовать этот подход даже в лексере (но там с проверкой семантических предикатов по соображениям производительности), который позволяет мне включать и выключать ключевые слова, например:
CONTRIBUTORS_SYMBOL: C O N T R I B U T O R S {serverVersion < 50700}?;
Попробуйте использовать функцию ДЛИНА
:
SELECT * FROM table ORDER BY LENGTH(myField);
В зависимости от того, что вы делаете, вы вместо этого может потребоваться использовать CHAR_LENGTH
:
Многобайтовый символ считается одним символом. Это означает, что для строки, содержащей пять двухбайтовых символов, LENGTH () возвращает 10, тогда как CHAR_LENGTH () возвращает 5.
Если вы не знаете, что это значит, вы, вероятно, захотите LENGTH
.