Symfony 4.2 utf8数据保存到MySQL时被切断

Symfony 4.2 utf8数据保存到MySQL时被切断,symfony,doctrine-orm,symfony-4.2,Symfony,Doctrine Orm,Symfony 4.2,我正在将CSV文件中的标题保存到数据库中 在Ubuntu上查看时,文件的开头如下: Date,Supermarket,Speciality,Takeaway,Caf<E9>/restaurant 1/06/2019,0.039175903,-0.01496395,0.03603785,0.029072835 1/07/2019,0.039399919,-0.008250166,0.022385733,0.015478668 ord(substr($csvHe

我正在将CSV文件中的标题保存到数据库中

在Ubuntu上查看时,文件的开头如下:

    Date,Supermarket,Speciality,Takeaway,Caf<E9>/restaurant
    1/06/2019,0.039175903,-0.01496395,0.03603785,0.029072835
    1/07/2019,0.039399919,-0.008250166,0.022385733,0.015478668
ord(substr($csvHeader,3,1))==233

这是通过以下函数读取的

protected function getCsvHeaders()
{
    $fh = fopen( $this->getCsvPath(), 'r+' );
    $firstrow = fgetcsv( $fh );
    fclose( $fh );
    return $firstrow;
}
这将保存到表DataConfiguration中:

$dataConf
  ->setColumns(serialize($csvHeader));
其设置为utf8mb4:

    show create table data_configuration;
    +--------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | Table              | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
    +--------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | data_configuration | CREATE TABLE `data_configuration` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `data_set_id` int(11) NOT NULL,
    `file_type_id` int(11) NOT NULL,
    `columns` varchar(7500) COLLATE utf8mb4_unicode_ci NOT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `unique_idx` (`data_set_id`,`file_type_id`),
    KEY `IDX_54A0B1FD70053C01` (`data_set_id`),
    KEY `IDX_54A0B1FD9E2A35A8` (`file_type_id`),
    CONSTRAINT `FK_54A0B1FD70053C01` FOREIGN KEY (`data_set_id`) REFERENCES `data_set` (`id`),
    CONSTRAINT `FK_54A0B1FD9E2A35A8` FOREIGN KEY (`file_type_id`) REFERENCES `file_type` (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=13176 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci |
条令似乎也配置为utf8mb4:

doctrine:
    dbal:
        # configure these for your database server
        driver: 'pdo_mysql'
#        server_version: '5.7'
        charset: utf8mb4
        default_table_options:
            charset: utf8mb4
            collate: utf8mb4_unicode_ci

        url: '%env(resolve:DATABASE_URL)%'
        options:
            1001: true
但是,数据在utf8字符处被切断,随后的取消序列化失败。我可以在我的Ubuntu18/AWS RDS环境以及本地MacOS/Brew环境中重现这一点


我还可以探索哪些其他途径来解决此问题?

您正在使用
fgetcsv()
解析文本文件。其文档说明了使用单字节编码文件时可能遇到的问题:

此函数将考虑区域设置。如果LC_CTYPE为例如en_US.UTF-8,则此函数可能会错误读取单字节编码的文件

如果文件包含基本ASCII表之外的法语字符,则可以将此变量设置为另一个值:

  • 列出已安装的区域设置:
    sh区域设置-a
  • en_US.utf8

    fr_fr.iso885915

    输出可能会有所不同。我无法告诉您保证存在于您的计算机上的区域设置。你必须选择像ISO-8859-1、Windows-1252这样的东西,而不是UTF-8

  • 在调用
    fgetcsv()
    之前,请将区域设置设置为与文件编码匹配的内容:
  • setlocale(LC_CTYPE,'fr_fr.iso885915');
    
  • 调用
    fgetcsv()
  • 或者,您可以手动转换编码:

    $row_utf8=mb_convert_编码($row_原始,“Windows-1252”,“UTF-8”);
    

    你的.csv文件提供了什么?

    你正在用
    fgetcsv()
    解析文本文件。其文档说明了使用单字节编码文件时可能遇到的问题:

    此函数将考虑区域设置。如果LC_CTYPE为例如en_US.UTF-8,则此函数可能会错误读取单字节编码的文件

    如果文件包含基本ASCII表之外的法语字符,则可以将此变量设置为另一个值:

  • 列出已安装的区域设置:
    sh区域设置-a
  • en_US.utf8

    fr_fr.iso885915

    输出可能会有所不同。我无法告诉您保证存在于您的计算机上的区域设置。你必须选择像ISO-8859-1、Windows-1252这样的东西,而不是UTF-8

  • 在调用
    fgetcsv()
    之前,请将区域设置设置为与文件编码匹配的内容:
  • setlocale(LC_CTYPE,'fr_fr.iso885915');
    
  • 调用
    fgetcsv()
  • 或者,您可以手动转换编码:

    $row_utf8=mb_convert_编码($row_原始,“Windows-1252”,“UTF-8”);
    


    你的.csv文件提供了什么?

    你能添加.csv文件的原始内容吗?@OMiShah已经粘贴了前3行,用更少的时间查看,这样就足够了吗?所以字符是
    带锐(é)的拉丁小e
    字符«é»对应于ASCII码130,而不是«Ú的233。你能试试ord(mb_substr($csvHeader,3,1))并发布代码吗?很抱歉@MarcosLabad的延迟。结果也是233。我已经添加了读取第一行的代码。你能添加.CSV文件的原始内容吗?@OMiShah已经粘贴了前3行,用更少的时间查看,这足够了吗?因此,字符是带有锐(é)的
    拉丁小e
    字符«é»对应于ASCII代码130,而不是«Ú的233。你能试试ord(mb_substr($csvHeader,3,1))并发布代码吗?很抱歉@MarcosLabad的延迟。结果也是233。我添加了读取第一行的代码。文件your.csv显示:ISO-8859文本,带有CRLF行终止符,但mb_convert_编码($row_raw,“ISO-8859-1”,“UTF-8”)将重音e转换为?这就像用正则表达式完全删除字符一样好。我要寻找的实际上只是在保存到数据库时,文本不会被截断。我不清楚为什么会发生这种情况,这与从文件中捕获正确的字符无关。@jdog有一系列标志使PHP更加冗长。我想它会在截断你的数据时记录一些东西。是的,也没有区别。我的mac上有很多地区设置,但不要以任何其他方式转换either@jdog您能否给出您尝试传递到
    setlocale(LC\u CTYPE,$x)
    的区域设置的示例?打印数据时,数据是否被截断?
    getCsvHeaders()
    是否继续获取�? 您是否确保所有脚本都以非扩展ASCII或UTF8编码?您的.csv文件显示:ISO-8859文本,带有CRLF行终止符,但mb_convert_编码($row_raw,“ISO-8859-1”,“UTF-8”)将重音e转换为?这就像用正则表达式完全删除字符一样好。我要寻找的实际上只是在保存到数据库时,文本不会被截断。我不清楚为什么会发生这种情况,这与从文件中捕获正确的字符无关。@jdog有一系列标志使PHP更加冗长。我想它会在截断你的数据时记录一些东西。是的,也没有区别。我的mac上有很多地区设置,但不要以任何其他方式转换either@jdog您能否给出您尝试传递到
    setlocale(LC\u CTYPE,$x)
    的区域设置的示例?打印数据时,数据是否被截断?
    getCsvHeaders()
    是否继续获取�? 您是否已确保所有脚本均以非扩展ASCII或UTF8编码?
    doctrine:
        dbal:
            # configure these for your database server
            driver: 'pdo_mysql'
    #        server_version: '5.7'
            charset: utf8mb4
            default_table_options:
                charset: utf8mb4
                collate: utf8mb4_unicode_ci
    
            url: '%env(resolve:DATABASE_URL)%'
            options:
                1001: true