Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我可以安全地使用带有utf8列的utf8mb4连接吗?_Php_Mysql_Pdo_Utf 8_Utf8mb4 - Fatal编程技术网

Php 我可以安全地使用带有utf8列的utf8mb4连接吗?

Php 我可以安全地使用带有utf8列的utf8mb4连接吗?,php,mysql,pdo,utf-8,utf8mb4,Php,Mysql,Pdo,Utf 8,Utf8mb4,我有一些带有utf8mb4字段的MySQL表,还有一些带有utf8字段的MySQL表 在所有表的PDO连接字符串中使用utf8mb4是否安全?或者我必须将所有内容转换为utf8mb4,或者启动两个不同的PDO连接 编辑:问题不是“我可以将4字节字符存储到utf8列中吗?”我们已经知道不能,这不取决于连接,因此如果列是utf8,则表示它将不会接收4字节字符,例如国家或货币代码、电子邮件地址、用户名。。。如果应用程序验证输入。简短回答:否,则不安全 如果您的数据包含utf8mb4字符,并且您使用的

我有一些带有utf8mb4字段的MySQL表,还有一些带有utf8字段的MySQL表

在所有表的PDO连接字符串中使用utf8mb4是否安全?或者我必须将所有内容转换为utf8mb4,或者启动两个不同的PDO连接



编辑:问题不是“我可以将4字节字符存储到utf8列中吗?”我们已经知道不能,这不取决于连接,因此如果列是utf8,则表示它将不会接收4字节字符,例如国家或货币代码、电子邮件地址、用户名。。。如果应用程序验证输入。

简短回答:,则不安全

如果您的数据包含
utf8mb4
字符,并且您使用的是MySQL
utf8
charset连接,您将遇到问题,因为MySQL
utf8
charset仅支持BMP字符(最多3个字节字符)


我的建议是将所有表转换为
utf8mb4
,以获得完全的UTF-8支持。另外,
utf8mb4
utf8
向后兼容

这可以通过以下脚本轻松测试:


简短回答:是,如果您仅使用3字节(或更短)UTF-8字符。


或者如果您打算使用4字节UTF-8字符,例如向后兼容字符,但存在一些问题:InnoDB的最大可索引长度从255个字符降至191个字符,固定长度字段(例如字符)每个字符多使用一个字节character@the_nuts尖刻的。还有更多信息,你回答了相反的问题。不,在utf8mb4列上使用utf8连接是不安全的,但反过来,它不应该工作得很好吗,这就是OP所问的吗?@accountaryم你说得对,我接受了它,因为它是唯一的一个,但它并没有回答这个问题实际上我接受了它,但最后我使用了一个utf8mb4连接,它处理一些utf8和拉丁列,没有任何问题。我通过这样做发现了同样的问题。但由于我必须为企业项目评估这一点,我不能依赖测试:正如我在《赏金》中所说的,我正在“从可信和/或官方来源寻找答案”,其中“官方”是关键词。@Dr.GianluigiZaneZanettini-有什么比可复制的测试更可信?您甚至可以使用所有
utf8
(3字节)字符运行测试。更可靠的是官方文档说明了这一点。“让我们试试看会发生什么”的问题是,您可能总是会错过一些测试用例。@Dr.GianluigiZaneZanettini-我怀疑您是否会找到这样一种说法:“如果您只使用Y中的字符,使用字符集X进行连接,使用字符集Y进行存储数据是安全的”。他们需要为每一对字符集编写它。您甚至找不到一条语句,它告诉您可以安全地将utf8mb4连接用于utf8mb4数据。(不-这不是打字错误-我的意思是相同的字符集)你需要解释文档。我的解释是我回答的最后一句话。完全阅读。这个问题模棱两可。您是否会存储4字节utf8mb4字符,如感谢!只是澄清一下:“假设连接为utf8mb4,表中的列仅为utf8”@Dr.GianluigiZaneZanettini-连接参数表示客户端的编码。如果它是错误的,可能会发生各种错误(请参阅我链接到的其他bug)。如果连接指定客户端中只有3字节的“utf8”,那么在客户端中使用4字节表情符号是一种“错误”形式。@Dr.GianluigiZaneZanettini-也许我刚才添加到回答中的内容直接针对了您的评论。