Сұратқан кезде db-та кездейсоқ әріптің жоғарғы және кіші әріпсанмен қалай жұмыс істеуге болады?

Дерекқорда жолмен сұрау кезінде кездейсоқ жоғарғы және кіші әріптермен күресудің ең жақсы жолы қандай?

Кейбір стандартты әдіс бар ма, әлде дерекқордағы енгізулерді барлық төменгі регистрлер болуы және оларға кейінірек түрлендіруі керек пе?

Қазір PHP-де осы сұраным бар:

    $get_category = "select category_name from categories where category_name = ".$some_var;

бірақ жоғарғы немесе төменгі регистрлер болуы мүмкін жазбалармен айналысқан кезде ең жақсы тәсілі бар ма екеніне сенімді емес.

MySQL-ды қолданамын.

Рахмет, Алекс

3

7 жауаптар

MySQL - регистрді ескереді немесе салыстыру түріне байланысты емес. '_Ci' дегенмен аяқталатын салыстыруды таңдап алыңыз (жағдайға сезімтал емес) және осы бағандағы сұраулар кездейсоқ емес салыстыруды қолданады.

Тағы бір шешім бағанды ​​және іздеу мәнін бас әріпке айналдыру үшін UPPER функциясын қолдану болады, бірақ мұны істеу бағанды ​​ешқандай индекстерді пайдаланбайды.

6
қосылды
Сәлем, әңгімелесумен шынымен таныс емес. Бұл сұрақтың бір бөлігі болып табылатын нәрсе ме? Немесе кесте құрылымы? Мұны қалай орындадым?
қосылды автор GeekedOut, көзі
Бұл кесте құрылымының бөлігі. Дерекқор, кесте немесе бағанға арналған салыстыруды орнатуға болады. Сіз мұны PHPMyAdmin ішінен таңдауға немесе оны DDL мәлімдемесі арқылы орнатуға болады. Мұнда қандай салыстыру туралы ақпарат бөлігі . Және мұнда қалай орнатуға болады .
қосылды автор GolezTrol, көзі
@pst Сізге алғыс айтамын, noreferrer"> шынымен аласыз. Дегенмен құжаттама өнімділікке әсері туралы анық емес (индекстерді дәлірек қолдану). upper сияқты индекстерді пайдалануды жояды деп ойлаймын, бірақ сенімді емеспін.
қосылды автор GolezTrol, көзі
Қосымша ақпарат алу үшін мысал немесе сілтеме бере аласыз ба? «_Ci» дегенмен аяқталатын салыстыруды таңдау. Менің googling мұны қалай жасай алмады.
қосылды автор Marvo, көзі
COLLATION-ты LIKE-да көрсетуге болады. Басқа жағдайлар туралы сенімді емес.
қосылды автор user166390, көзі
@GolezTrol Ықтимал индекстер өзара әрекеттесуі туралы жақсы ...
қосылды автор user166390, көзі

MySQL-дың әдепкі сұлбалары регистрге тәуелді емес, сондықтан «Hello» және «HeLLo» тең. Деректерді дәйекті корпусқа мәжбүрлеу қажет болса, LOWER() және UPPER() жол функциялары.

1
қосылды

Өткенде мен өзімнің түпнұсқа жолын сақтап қалуым керек болғанда (мысалы, логин атауы) қалыпты (басқа жоғарғы немесе кіші әріппен) басқа бағанды ​​жасау керек еді. Осылайша, мен салыстырмалы салыстыруды дәл сол жағдайға салыстыру арқылы ғана салыстыруға болады.

Егер өнімділік мәселе емес (мысалы, деректердің көп емес) болса, онда жоғарғы() немесе төменгі() бағанды ​​бағанға қолдануға болады. Бірақ мұны үстелді сканерлеуге кепілдік береді.

1
қосылды

Жалпы үлгі - ойын өрісін теңестіру және салыстыру жолдарын бірдей жағдайды жасау. Мысалға:

$get_category = "select category_name from categories 
    where lower(category_name) = ".strtolower($some_var);
1
қосылды

Сіз сондай-ақ мынаны көре аласыз:

«санаты бойынша category_name таңдаңыз LOWER (category_name) = LOWER (». $ some_var. «)»;

бірақ бұл баяу болуы мүмкін (дерекқорда кішігірім санат_атауы сақталатын болса, жылдам болады).

1
қосылды

SQL COLLATION қатарын қолдайды, олардың кейбіреуі регистрге тәуелді емес. (SQL стандартында басқаша айтылғанын білмеймін, бірақ сатушы құжаттамасына жүгініңіз.)

Бұл жағдайда Іс-әрекеттегі кездейсоқтық сезімталдығы бөлімінен қараңыз. MySQL нұсқаулығы. Мұнда қолдайтын слайдтар тізімін қараңыз, мұнда < code> _ci -postfixed сценарийлер регистрге тәуелді емес.

Әр кесте схемасында көрсетілуіне қоса, COLLATION сұраудағы LIKE операторы үшін де көрсетілуі мүмкін.

Бақытты кодтау.


Және, өтінеміз, өтінеміз, өтінеміз, SQL сақтайтын шабуылдардан аулақ болу үшін SQL жолдарын сақтау үшін толтырғыштарды пайдаланыңыз!

1
қосылды

Сіз UPPER sql функциясын сынау үшін пайдалана аласыз:

$get_category = "select category_name from categories where UPPER(category_name) = UPPER(".$some_var.");

Бірақ бұл шынымен де тиімсіз. Басынан бастап құндылықтарды үлкен (немесе кіші әріппен) сақтау керек.

EDIT тармағын таңдаңыз

Сондай-ақ, айнымалы мәндерді сұрауға жай қоюдың орнына параметрленген сұрауларды пайдалануды шынымен қарастырған жөн. Бұл SQL инъекциялық шабуылдардың алдын алуға көмектеседі!

For instance, you could prepare & execute your query like so:

 $preparedStatement = $db->prepare('SELECT category_name FROM categories WHERE UPPER(category_name) = :category');
 $preparedStatement->execute(array(':category' => strtoupper($some_var)));
 $rows = $preparedStatement->fetchAll();
0
қосылды