УНИЧЕНИЕ (ГЕКСАДЕКСИМАЛЬНЫЕ) ЛИГНАЛЫ СМАСНОСТИ в MySQL

StackOverflow https://stackoverflow.com/questions/4256657

Вопрос

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

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

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

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

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

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

Это было полезно?

Решение 2

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

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

set names utf8

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

set character set utf8

нет.

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

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

Другие советы

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

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

update mytable set myfield = unhex(replace(hex(myfield),'C383','C3'))

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top