Учите матчасть, Шура!


Опять двойка?
Сегодня, други мои, я не пишу ничего заумного, не учу жить и программировать. Сегодня хочу поплакаться к вам в жилетку.

Да, да!!

Ибо сегодня я обнаружил себя полнейшим двоечником и облажался по полной программе. Так что сегодня в программе нытьё, сопли и безжалостное самобичевание. Всё убрано подкат.

Во первых, я уже писал, что хоть я и оседлал AJAX, тем не менее для меня очень многое там является вуду и магией. Так например я обнаружил, что при посылке строки с кириллическими символами вкачестве аргумента для AJAX-функции, к ней пришлёпывается мистический префикс «<![CDATA[«. Причём именно префикс, в конце ничего не было. Гугление немного пролило свет природу этого явления, но так и не объяснило зачем оно мне нужно.

Ну делать нечего, решил я тупо вырезать префикс функцией str_replace — префикс то мне мешает! А он, падла, не вырезается!! Не находит совпадения строки и всё тут!!

Я с ним и так и этак. Битых два часа пришлось потратить ,чтобы понять что символ «<«, который я видел в броузере, реально в строке представлен 4 символами «&lt;«. А ведь мог сразу догадаться, что браузер просто так угловатые скобки не выводит!

Во-вторых я пытался сделать регистронезависимое сравнение средствами MySQL. Причём я делал SQL-запрос не сам, а средствами класса Active Record из CodeIgniter. А средства там, надо сказать, довольно бедненькие. Типовой запрос можно составить, а если что-то с переподвывертом — то облом.

Так я пришёл к варианту:

$this->db->like('upper(name)',trim(strtoupper($str)));
$this->db->order_by('name');
$query = $this->db->get('mytable');

То есть я перед сравнением пытался приводить обе строки в верхний регистр. Но оказалось, что функция MySQL upper и функция strtoupper иногда ведут себя по-разному. Например, у меня получились грабли с кириллицей.

И, после стольких мучений и испытаний, обратился я наконец к мануалу по MySQL, и снизошло на меня просветление!

Оказывается нужно было просто перевести COLLATION у всех моих баз данных, таблиц и их строковых полей в какой-нибудь регистронезависимый вариант. Например в utf8_general_ci (было utf8_bin). И всё! Стало работать без предварительного приведения в верхний регистр.

Код получился такой:

$this->db->like('name',trim($str));
$this->db->order_by('name');
$query = $this->db->get('mytable');

Вот такой получился денёк.
Надеюсь что сообщил в этом посте хоть что-то ценное и интересное.

Учите матчасть, Шура!: 2 комментария

  1. altesack Автор записи

    Окончание ci означает case-insensitive
    Сам в шоке :)

Комментарии запрещены.