如何使用PHP及mssql_connect向SQL Server插入emoji?
问题根因
你使用的mssql扩展(对应mssql_connect驱动)本身存在底层编码限制:该扩展仅支持UCS-2编码,无法处理UTF-8的4字节字符(所有emoji都属于4字节Unicode字符),你已经设置的mssql.charset = "UTF-8"配置无法解决这个底层缺陷。传输过程中emoji会被截断为乱码,直接破坏了原SQL语句的引号闭合结构,因此才会返回Incorrect syntax near ''的语法错误。你在SQL Server客户端执行相同语句正常,是因为客户端的编码传输链路完整支持4字节Unicode,不存在字符截断问题。
解决方案
- 方案1(长期最优):替换驱动为微软官方推出的
sqlsrv扩展,该扩展完美支持UTF-8 4字节字符,兼容PHP 5.6和SQL Server 2016版本。连接时明确指定字符集为UTF-8即可,示例代码如下:
连接成功后直接执行原有带$server = "你的数据库服务地址"; $connParams = [ "Database" => "你的数据库名", "UID" => "数据库账号", "PWD" => "数据库密码", "CharacterSet" => "UTF-8" ]; $conn = sqlsrv_connect($server, $connParams);N前缀的插入语句即可正常写入emoji到NVARCHAR(MAX)字段。 - 方案2(临时应急,不推荐长期使用):如果暂时无法更换驱动,可以先把要插入的字符串中的emoji转义为HTML实体后再执行插入,读取时再做反转义处理,示例代码如下:
该方案的缺点是数据库中存储的是转义后的实体内容,模糊查询、排序等操作都会受影响,仅适合临时过渡使用。$content = htmlentities('📅 example', ENT_QUOTES, 'UTF-8'); $sql = "INSERT INTO [table] (text) VALUES (N'$content')";
内容的提问来源于stack exchange,提问作者Lorenzo
相关产品推荐
相关产品推荐

