Символьные литералы Unicode (шестнадцатеричные) в MySQL

Есть ли способ указать литералы символов Unicode в MySQL?

Я хочу заменить символ Unicode символом Ascii, например, следующим образом:

Update MyTbl Set MyFld = Replace(MyFld, "ẏ", "y")

Но я использую еще более непонятные символы, которых нет в большинстве шрифтов, поэтому я хочу иметь возможность использовать литералы символов Unicode, что-то вроде

Update MyTbl Set MyFld = Replace(MyFld, "\u1e8f", "y")

Этот оператор SQL вызывается из PHP-скрипта — первая форма не только нечитаема, но и фактически не работает!


person ChrisV    schedule 23.11.2010    source источник


Ответы (5)


Вы можете указать шестнадцатеричные литералы (или даже бинарные литералы), используя 0x, x'' или X'':

select  0xC2A2;
select x'C2A2';
select X'C2A2';

Но имейте в виду, что возвращаемый тип представляет собой двоичную строку, поэтому каждый байт считается символом. Вы можете проверить это с помощью char_length:

select char_length(0xC2A2)

2

Если вам нужны строки UTF-8, вам нужно использовать convert:

select convert(0xC2A2 using utf8mb4)

И мы видим, что C2 A2 считается 1 символом в UTF-8:

select char_length(convert(0xC2A2 using utf8mb4))

1


Кроме того, вам не нужно беспокоиться о недопустимых байтах, потому что convert удалит их автоматически:

select char_length(convert(0xC1A2 using utf8mb4))

0

Как видно, вывод равен 0, поскольку C1 A2 является недопустимой последовательностью байтов UTF-8.

person Pacerier    schedule 26.01.2015

Спасибо за ваши предложения, но я думаю, что проблема была в системе.

Есть много уровней, которые нужно открыть, но, насколько я могу судить, (по крайней мере, на этом сервере) команда

set names utf8

делает обработку utf-8 правильной, тогда как

set character set utf8

нет.

В моей среде они вызываются из PHP с использованием PDO, какая разница, какая разница.

Спасибо, в любом случае!

person ChrisV    schedule 29.11.2010

Вы можете использовать функции hex и unhex, например:

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))
person borrible    schedule 23.11.2010

Строковый синтаксис MySQL указан здесь, как вы можете см., числовые управляющие последовательности не предусмотрены.

Однако, поскольку вы встраиваете SQL в PHP, вы можете вычислить правильные байты в PHP. Убедитесь, что байты, которые вы вставляете в SQL, действительно соответствуют вашему клиентский набор символов.

person Martin v. Löwis    schedule 23.11.2010

Существует также функция char, которая позволит вам хотел (предоставляя номера байтов и имя набора символов) и получая char.

person epeleg    schedule 10.03.2011