Unicode (шестнадцатеричные) символьные литералы в MySQL - PullRequest
6 голосов
/ 23 ноября 2010

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

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

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

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

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

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

Ответы [ 5 ]

5 голосов
/ 26 января 2015

Вы можете указать шестнадцатеричные литералы (или даже двоичные литералы ), используя 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.

3 голосов
/ 29 ноября 2010

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

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

set names utf8

делает обработку utf-8 корректно, тогда как

set character set utf8

нет.

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

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

2 голосов
/ 23 ноября 2010

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

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))
0 голосов
/ 10 марта 2011

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

0 голосов
/ 23 ноября 2010

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

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

...