MySQLのUnicode(16進数)文字リテラル
-
27-09-2019 - |
質問
MySQLでUnicode文字リテラルを指定する方法はありますか?
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
そうではありません。
私の環境では、これらはPDOを使用してPHPから呼び出されています。
とにかくありがとう!
他のヒント
指定できます 16進数リテラル (あるいは バイナリリテラル)使用 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
UTF-8の1文字と見なされます:
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文字列構文が指定されています ここ, 、ご覧のとおり、数値エスケープシーケンスの規定はありません。
ただし、PHPにSQLを埋め込んでいるため、PHPで右バイトを計算できます。 SQLに入れたバイトが実際にあなたの一致していることを確認してください クライアント文字セット.
あります char
働き これにより、あなたが望むもの(バイト番号とcharSet名を提供します)とcharを取得することができます。