为什么有不同级别的MySQL排序规则/字符集?
作者:互联网
查看MySQL服务器变量,服务器和数据库排序规则设置为latin1_swedish_ci,但collaction_connection为utf8_general_ci.此外,collation / charset设置在许多级别:服务器,数据库,表和列.您还需要考虑PHP MySQL连接的字符集.
我的问题有四个:
>为什么有不同级别的MySQL排序规则/字符集?是这样你可以混合你的角色来满足你的需求吗?如果我错了,请纠正我,但utf8似乎是一般用途的最佳字符集,为什么我使用的大多数LAMP设置都默认使用latin1?
>您是否应始终确保PHP连接与您正在处理的数据库的字符集匹配?
>如果您可以使用不同的表来使用不同的字符集,您只需使用SET NAMES或mysql(i)_set_charset进行切换吗?
>如果您有一个包含多个字符集的表,那么您如何管理它,因为连接一次只能使用一个字符集?
非常感谢.
编辑:
关于评论:
“你可以使用前者,前者仅设置结果字符集,后者设置PHP内部编码,用于mysqli_real_escape_string和结果编码.”
我以为你不打算一起使用real_escape_string和SET NAMES.见:http://www.php.net/manual/en/mysqlinfo.concepts.charset.php
解决方法:
问题#1
Why are there different levels of MySQL collation/charsets?
对问题#1的回答
不同的字符集和排序规则有两个很好的理由
原因#1:磁盘空间
运行此查询时
SELECT
maxlen,
GROUP_CONCAT(CHARACTER_SET_NAME) CharSets,
COUNT(1) CharSetCount
FROM information_schema.character_sets
GROUP BY maxlen\G
你得到这个:
mysql> SELECT
-> maxlen,
-> GROUP_CONCAT(CHARACTER_SET_NAME) CharSets,
-> COUNT(1) CharSetCount
-> FROM information_schema.character_sets
-> GROUP BY maxlen\G
*************************** 1. row ***************************
maxlen: 1
CharSets: cp1257,cp850,binary,koi8r,latin2,ascii,tis620,koi8u,greek,armscii8,keybcs2,macroman,latin7,cp1251,cp1256,dec8,hp8,geostd8,latin1,swe7,hebrew,cp1250,latin5,cp866,macce,cp852
CharSetCount: 26
*************************** 2. row ***************************
maxlen: 2
CharSets: big5,cp932,sjis,gbk,ucs2,euckr,gb2312
CharSetCount: 7
*************************** 3. row ***************************
maxlen: 3
CharSets: eucjpms,ujis,utf8
CharSetCount: 3
*************************** 4. row ***************************
maxlen: 4
CharSets: utf16,utf32,utf8mb4
CharSetCount: 3
4 rows in set (0.00 sec)
mysql>
某些字符集的最大长度为1个字节以表示字符.其他需要更多.提供此信息,您可能希望避免使用eucjpms,ujis,utf8,utf16,utf32,utf8mb4字符集,以便VARCHAR和TEXT数据占用较少的磁盘空间.
理由#2:国际化
字符设置每个附带一个或多个排序以涵盖各种语言
运行此查询时
SELECT
A.CHARACTER_SET_NAME,
GROUP_CONCAT(COLLATION_NAME) Collations,
COUNT(1) CollationCount
FROM
information_schema.character_sets A
INNER JOIN information_schema.collations B
USING (CHARACTER_SET_NAME)
GROUP BY A.CHARACTER_SET_NAME\G
您将看到一些字符集具有针对欧洲不同部分的多个排序规则.还提供中国,日本,希腊以及小亚细亚和斯堪的纳维亚半岛的部分地区.
问题2
Should you always ensure your PHP connection matches the charset of the database you’re working on?
回答问题#2
情景
你在凌晨3点开车.你是路上唯一的司机.你来到一个十字路口.你有红灯.
问题:你停止还是经历红灯?
答:取决于邻居
>安全的邻居?
>有些人遵守法律,停在红色,等待绿色.
>有机会并经历
>坏邻居或新区域?
>有些人遵守法律,停在红色,等待劫持风险的绿色
>有一些机会,并通过以避免或减少卡车的风险
>假设最坏的情况并找到另一条路线
这是如何适用的?
你应该小心谨慎.你应该事先检查字符集,因为你不知道PHP连接将进入的邻域(客户端程序,互联网浏览器)以及是否存在劫车的风险(将无效数据放入数据库,请求过多的数据用于检索).
问题#3
If you can have different tables that use different character sets do you just use SET NAMES or mysql(i)_set_charset to switch?
回答问题#3
无论如何
问题#4
If you have a table that has multiple charsets how do you manage that since the connection can only use one charset at a time?
回答问题#4
您可能必须使用数据库会话转移字符集.以下是可在会话级别更改的设置:
> character_set_client
> character_set_connection
> character_set_database
> character_set_filesystem
> character_set_results
在读取和写入数据库之前,请仔细设置.将字符集名称和排序规则存储在您将访问的同一个表中也是明智之举.
标签:php,mysql,collation,character-set 来源: https://codeday.me/bug/20190806/1594858.html