我在PHP中使用一个加密函数(mcrypt_create_iv)。我在数据库表中看到,存储此函数返回值的字段是latin1_swedish_ci
字符集,而在CodeIgniter(config/database.php)中,字符集设置为utf8
。
我测试了在CI中将字符集保持为utf8
,并运行将加密数据存储到tables列中的方法,但它返回了一堆问号和一些东西,这些东西让我对mcrypt函数的工作没有信心。
因此,我将CI数据库字符集更改为latin1
,这与数据库表中的字段相同。我的DB配置文件现在看起来像:
$db['default']['char_set'] = 'latin1';
$db['default']['dbcollat'] = 'utf8_general_ci';
我想知道同时使用latin1
和utf8
是否会出现问题?我可以感觉到它看起来不太对劲,使用了两个不同的字符集等等,但为了使用mcrypt_create_iv
函数(用于对密码进行salt处理,这是一个很大的imo),我还是选择了这样做,希望它不会影响任何事情(即正确插入/获取数据)。
有人能帮我解释一下吗?我真的很感激。谢谢
使用字符集latin
但使用UTF排序规则没有多大意义。latin
字符集会将大多数unicode字符转换为"?",因为它们不存在于指示的字符集中。使用基于不在所选字符集中的字符的排序规则不会有任何作用。
所以:如果你想存储所有的文本数据,你需要更改你的字符集utf8,并使用utf8_general_ci排序规则。如果你只想独占latin1
(我不知道你为什么要,但你可能…),那么也可以使用拉丁语的排序规则。
如果使用utf8,您还需要记住,当您设置到数据库的连接时,确保连接也使用utf8charset
和names
,这样您就不会在服务器和数据库之间的"传输中"丢失文本。