eloquent 中如何动态建立一个临时 connection 或者临时改变 charset?
前提条件
- Sql Server 数据库,table.column1 存储了 gbk 编码的经过位移操作后的数据。数据有中文,英文,数字,中英数混合等,字段类型为 char 。
- 前提1中的数据库表属性不能变动,位移操作可能是当时做为加密用的。
- eloquent 连接属性 charset=utf8 。
产生的问题
使用 utf8 读取 table.column1 数据会转换为 utf8 字符串,无法使用算法转回正常字符,如果使用 iconv 转回 GBK ,由于原存储数据是经过位移后的二进制数据,不是标准 GBK,转换后会丢失很多字符。
尝试的解决方法
- 使用
DB::connection()->getConfig()
获取数据库配置信息,修改 charset=gbk 然后使用new \Illuminate\Database\Connectors\ConnectionFactory()
新建一个 connection 专用于这个表的查询,但是不知道 ConnectionFactory() 需要的参数 container 怎么获取。 - 查阅 php 文档使用原生 PDO 的
PDOStatement::setAttribute , PDO::prepare , PDOStatement::bindColumn , PDOStatement::bindParam
方法时,附加参数 PDO::SQLSRV_ENCODING_BINARY 可以忽略字符串编码使用二进制读写数据。简单搜索了 eloquent 源码,似乎并没有设定参数的实现,做为最后方案备用。
请教
- 如何不提前设定数据库配置,建立一个临时的 connection ,或者临时更改 connection 的 charset 设置。
- eloquent 中是否有方法读取某列数据时,能忽略字符编码,读取char类型中原始编码数据。
谢谢。
推荐文章: