УНИЧЕНИЕ (ГЕКСАДЕКСИМАЛЬНЫЕ) ЛИГНАЛЫ СМАСНОСТИ в MySQL
-
27-09-2019 - |
Вопрос
Есть ли способ указать литералы символов 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
функция Это позволит тому, что вы хотели (предоставляя номера байтов и имя аренды) и получают чар.