Posted at

PHP、SQL Serverで絵文字を含むデータをLIKE検索したい


前提

・PHP 5.6.38

・SQL Server 12.0.2000.8

・対象のテーブルとデータ

MyCats

ID(INT)
Name(NVARCHAR(32))

1
バブルス🐣

2
ブロッサム🐈

3
バターカップ😇

登録の際はphp側でデータを変換してからSQLでinsertしています。


sample.php

$name = mb_convert_encoding($name, 'UTF-16LE','UTF-8');

$name = bin2hex($name);
$name = '0x' . $name;

INSERT

MyCats(ID, Name)
VALUES
 (4, CONVERT(varbinary(MAX), N'{$name}', 1));

こうすることで4バイト文字のデータを保持しています。

参考:freetds + SQLServer で絵文字をSELECT, INSERTする


方法

やはりまずphpで変換します。


sample.php

$name = mb_convert_encoding($name, 'UTF-16LE','UTF-8');

$name = bin2hex($name);
$name = '0x' . $name;

そして

SELECT ID, Name FROM MyCats WHERE Name LIKE '%' + CONVERT(NVARCHAR(32), {$name}) + '%';

っていうのでできました。

他にもやり方あるのかもしれませんが、一応これでできましたという一例でした。