[PHP] Laravel 体现 MySQL、Sqlite 数据的大小写敏感
要想实现数据比对的大小写敏感,方式是设置数据库字段类型 或者 字段校验字符集。
MySQL 和 Sqlite 所支持的 collations 形式是不同的,你可以通过以下文档了解到。
MySQL collations :https://dev.mysql.com/doc/refman/5.7/en/charset-binary-collations.html
Sqlite collations:https://www.sqlite.org/datatype3.html(7. Collating Sequences)
MySQL 可以分别对 服务器、数据库、表、字段 的字符校验进行设置。
MySQL 要开启数据大小写敏感的时候,如果不想全局设置,那么可以对具体字段选择 collations,简述如下:
二进制字符(BINARY,VARBINARY,BLOB)有一个 binary 的 collation。
非二进制字符(CHAR,VARCHAR,TEXT)的 collation 是字符集加 _bin 后缀,比如 utf8mb4_bin。
在 Laravel 的单元测试中,一般会使用 Sqlite 的内存数据库进行数据存储测试,简单快速。
<server name="DB_CONNECTION" value="sqlite"/> <server name="DB_DATABASE" value=":memory:"/>
基础 TestCase 初始化中,一般是需要执行 migrate 创建表的,这样才能进行后面的数据库功能测试。
所以,一种方式是,在 migration 文件中对 DB_CONNECTION 进行判定,执行对应驱动的 ·字段· 或者 ·collation· 设置 。
public function up() { if (env('DB_CONNECTION') == 'mysql') { Schema::table('tags', function (Blueprint $table) { $table->string('name', 13)->collation('utf8mb4_bin')->change(); }); } else if (env('DB_CONNECTION') == 'sqlite') { // For phpunit sqlite driver Schema::table('tags', function (Blueprint $table) { $table->binary('name')->change(); }); } else { } }
Refer:Laravel数据库的坑