[Dbix-class] Deployment seems to destroy CHARACTER SET settings on MySQL tables

Matija Grabnar matija at serverflow.com
Thu Aug 14 09:09:24 GMT 2014


Lianna, thank you!

  I put the module you wrote in my lib directory, and I modified the 
call I make to dbicdump to
include the loader class:

dbicdump -I ./lib
            -o dump_directory=./lib \
            -o debug=1 \
            -o 
loader_class='MyApp::Schema::Loader::DBI::mysql::ExtraColumnInfo' \
            MyDB \
            'dbi:mysql:dbname=mydb' \
            someusername \
            notthepassword

But it still doesn't record the character set details into the Result 
files that it generates (or anywhere else that I can find). And that 
means that the install/upgrade scripts also don't get the info.

I am using DBIx::Class::Schema::Loader 0.7039, do I need a later 
version? Or am I missing something else?


Best regards,
                  Matija Grabnar

On 08/12/2014 04:41 PM, Lianna Eeftinck wrote:
> package MyApp::Schema::Loader::DBI::mysql::ExtraColumnInfo;
> use strict;
> use warnings;
> use base 'DBIx::Class::Schema::Loader::DBI::mysql';
> use mro 'c3';
>
> my $mysql_text_types = qr/^(?: var(?:char)? | char(?:acter)? | 
> (?:tiny|medium|long)?text )$/msxi;
>
> sub new {
>     return shift->next::method( @_ );
> }
>
> sub _extra_column_info {
>     my ( $self, $table, $col, $info, $dbi_info ) = @_;
>
>     my $extra_info = $self->next::method( $table, $col, $info, 
> $dbi_info );
>
>     if ( $info->{data_type} =~ /$mysql_text_types/msxi ) {
>         my ( $character_set_name, $collation_name ) = eval {
>             $self->dbh->selectrow_array( qq{
>                SELECT character_set_name, collation_name
>                FROM information_schema.columns
>                WHERE table_name = ? AND lower(column_name) = ?
>             }, {}, $table->name, lc( $col ) );
>         };
>
>         if ( my $has_information_schema = not $@ ) {
>             $extra_info->{ extra }{ mysql_collate } = $collation_name;
>             $extra_info->{ extra }{ mysql_charset } = $character_set_name;
>         }
>     }
>
>     return $extra_info;
> }
>
> 1;
>
>
> And include it in the schema loader options too:
>
> loader_class => 'MyApp::Schema::Loader::DBI::mysql::ExtraColumnInfo'
>
> It's actually reading the database where this information gets lost, 
> it's never stored in the YAML generated by DBIx::Schema::Loader, so it 
> won't be output properly either until it is added.
>
> -- Lianna
>
>
>
> On 10 August 2014 15:32, Matija Grabnar <matija at serverflow.com 
> <mailto:matija at serverflow.com>> wrote:
>
>     I am developing a Catalyst application that uses DBIx::Class. I
>     thought I would do things right and use
>     DBIx::Class::DeploymentHandler right from the start.
>     I was able to get it to deploy and upgrade my tables very nicely.
>     However, I have run into a show stopper now:
>
>     The character set settings of tables and strings are not
>     preserved. That means that if I declare a table like this:
>
>     create table graph_category (
>     id serial primary key,
>     category varchar(190) CHARACTER SET utf8mb4 COLLATE
>     utf8mb4_unicode_ci,
>     unique index i_graph_category_category(category)
>     ) engine=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
>
>     and then do
>     dbicdump -o dump_directory=./lib \
>                -o debug=1 \
>                MyDB \
>                'dbi:mysql:dbname=mydb' \
>                someusername \
>                notthepassword
>
>
>     And then a script containing
>      my $dh = DBIx::Class::DeploymentHandler->new(
>          {
>              schema              => $schema,
>              script_directory    => "$FindBin::Bin/../dbicdh",
>              databases           => 'MySQL',
>              sql_translator_args => { add_drop_table => 1 },
>              force_overwrite     => $force_overwrite,
>          }
>         );
>
>     $dh->prepare_install;
>     $dh->install;
>
>     The table in the database will become:
>
>     CREATE TABLE `graph_category` (
>       `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
>       `category` varchar(190) DEFAULT NULL,
>       PRIMARY KEY (`id`),
>       UNIQUE KEY `i_graph_category_category` (`category`)
>     ) ENGINE=InnoDB DEFAULT CHARSET=latin1
>
>     In other words, all the character set info has disappeared. Since
>     the requirements specify a lot of UTF8 work, I find that quite
>     distressing. And in production, I'm afraid it could lead to data
>     corruption.
>
>     Does anybody know of a way to avoid this problem (short of
>     discarding DeploymentHandler altogether)?
>
>     _______________________________________________
>     List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
>     IRC: irc.perl.org#dbix-class <http://irc.perl.org#dbix-class>
>     SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
>     Searchable Archive:
>     http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk
>
>
>
>
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20140814/deb99e83/attachment.htm>


More information about the DBIx-Class mailing list