Because of mysql inno_db limitations, strip 4 bytes utf8 chars (e. g. emojis). Unfortunaly UTF8mb4 will raise other limitaions of max varchar and lower index sizes. More details: http://pjambet.github.io/blog/emojis-and-mysql/

This commit is contained in:
Martin Edenhofer 2014-06-01 10:29:58 +02:00
parent cc0e8d34dc
commit bf42e989bb
4 changed files with 28 additions and 4 deletions

View file

@ -863,9 +863,14 @@ check string/varchar size and cut them if needed
current_length = attribute[1].to_s.length
if limit < current_length
puts "WARNING: cut string because of database length #{self.class.to_s}.#{attribute[0]}(#{limit} but is #{current_length}:#{attribute[1].to_s})"
self[attribute[0]] = attribute[1][ 0, limit ]
self[ attribute[0] ] = attribute[1][ 0, limit ]
end
end
# strip 4 bytes utf8 chars if needed
if column && self[ attribute[0] ]
self[attribute[0]] = self[ attribute[0] ].utf8_to_3bytesutf8
end
}
end

View file

@ -23,4 +23,19 @@ class String
camel_cased_word = self.to_s
camel_cased_word.gsub(/::/, '/').downcase
end
# because of mysql inno_db limitations, strip 4 bytes utf8 chars (e. g. emojis)
# unfortunaly UTF8mb4 will raise other limitaions of max varchar and lower index sizes
# More details: http://pjambet.github.io/blog/emojis-and-mysql/
def utf8_to_3bytesutf8
return if ActiveRecord::Base.connection_config[:adapter] != 'mysql2'
self.each_char.select {|c|
if c.bytes.count > 3
puts "WARNING: strip out 4 bytes utf8 chars '#{c}' of '#{ self }'"
next
end
c
}
.join('')
end
end

View file

@ -25,13 +25,15 @@ class TicketTest < ActiveSupport::TestCase
:to => 'some_recipient@example.com',
:subject => 'some subject',
:message_id => 'some@id',
:body => 'some message',
:body => 'some message article_inbound 😍😍😍',
:internal => false,
:ticket_article_sender => Ticket::Article::Sender.where(:name => 'Customer').first,
:ticket_article_type => Ticket::Article::Type.where(:name => 'email').first,
:updated_by_id => 1,
:created_by_id => 1,
)
assert_equal( article_inbound.body, 'some message article_inbound 😍😍😍'.utf8_to_3bytesutf8, 'article_inbound.body verify - inbound' )
ticket = Ticket.find(ticket.id)
assert_equal( ticket.article_count, 1, 'ticket.article_count verify - inbound' )
assert_equal( ticket.last_contact.to_s, article_inbound.created_at.to_s, 'ticket.last_contact verify - inbound' )

View file

@ -96,7 +96,7 @@ class TwitterTest < ActiveSupport::TestCase
end
reply_hash = '#weather' + rand(9999).to_s
reply_text = '@armin_theo on my side the weather is also nice! ' + reply_hash
reply_text = '@armin_theo on my side the weather is also nice! 😍😍😍 ' + reply_hash
tweet = client.update(
reply_text,
{
@ -109,10 +109,12 @@ class TwitterTest < ActiveSupport::TestCase
# fetch check system account
Channel.fetch
reply_text = reply_text.utf8_to_3bytesutf8
# check if follow up article has been created
assert_equal( article.ticket.articles.count, 2 )
reply_article = article.ticket.articles.last
assert_equal( reply_article.body, reply_text )
assert_equal( reply_article.body, )
end