tex*_*ate 6 mysql collation php character-set
查看 MySQL 服务器变量,服务器和数据库排序规则设置为 latin1_swedish_ci,但 collaction_connection 为 utf8_general_ci。此外,排序规则/字符集设置在多个级别:服务器、数据库、表和列。您还需要考虑 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
为什么 MySQL 有不同级别的排序规则/字符集?
不同的字符集和排序规则有两个很好的理由
当您运行此查询时
SELECT
maxlen,
GROUP_CONCAT(CHARACTER_SET_NAME) CharSets,
COUNT(1) CharSetCount
FROM information_schema.character_sets
GROUP BY maxlen\G
Run Code Online (Sandbox Code Playgroud)
你得到这个:
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>
Run Code Online (Sandbox Code Playgroud)
某些字符集的最大长度为 1 个字节来表示一个字符。其他需要更多。提供此信息后,您可能希望避免使用 eucjpms、ujis、utf8、utf16、utf32、utf8mb4 字符集,以便 VARCHAR 和 TEXT 数据占用更少的磁盘空间。
每个字符集都带有一个或多个排序规则以涵盖多种语言
当您运行此查询时
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
Run Code Online (Sandbox Code Playgroud)
您将看到某些字符集具有针对欧洲不同地区的多种排序规则。还提供中文、日文、希腊文以及小亚细亚和斯堪的纳维亚半岛的部分地区。
您是否应该始终确保您的 PHP 连接与您正在使用的数据库的字符集匹配?
您在凌晨 3:00 开车。您是路上唯一的司机。你来到一个十字路口。你闯红灯了
你应该谨慎行事。您应该始终事先检查字符集,因为您不知道 PHP 连接将进入的邻居(客户端程序、互联网浏览器)以及是否存在劫持风险(将无效数据放入数据库、请求太多数据进行检索) )。
如果您可以拥有使用不同字符集的不同表,您只需使用 SET NAMES 或 mysql(i)_set_charset 进行切换吗?
无论如何
如果您有一个包含多个字符集的表,由于连接一次只能使用一个字符集,您如何管理它?
您可能必须使用数据库会话更改字符集。以下是可以在会话级别更改的设置:
请在读取和写入数据库之前仔细设置这些内容。将字符集名称和排序规则存储在您将访问的同一个表中也是明智的做法。
归档时间: |
|
查看次数: |
2859 次 |
最近记录: |